2012-08-07 71 views
1

在我正在为我的学校工作的网站上,用户输入他们的学校电子邮件和密码,如果他们已经注册,则他们登录。如果不是,则在第二部分会显示登录信息,要求输入笔名并确认密码。正因为如此,还有我那令人费解的业余Django编程,我有一个名为er的错误列表。暂时,当程序测试电子邮件是否是学校电子邮件时,它可能会添加到呃列表“仅限学校电子邮件”。我也使用两个表单类。该页面使用ajax来调用该函数,该函数使用纯html而不是JSON,因为网站的体积较小。Django:转移/访问表单完整的错误信息

在forms.py文件我有:

class log_in(forms.Form): 
    username = forms.EmailField(error_messages= {'required': "Email Field is required,", 'invalid' : "Invalid Email Address."}) 
    password = forms.CharField(help_text = 'Password Invalid') 

class new_user(forms.Form): 
    username = forms.EmailField(error_messages = {'required': "Email Field is required,", 'invalid' : "Invalid Email Address."}) 
    password = forms.CharField(required=True) 
    password2 = forms.CharField(required=True) 
    pen_name = forms.CharField(max_length=30, min_length=3, error_messages = {'required': "Pen Name is required", 'max_length': "Pen Name must be less than 30 characters", 'min_length': "Pen Name must be more than 3 characters"}) 

的问题是,我想转让我在ERROR_MESSAGE参数急诊室列表中指定的完整的错误消息。

这是我views.py文件

def user_log_in(request): 
    er = [] 
    user_pass = log_in(request.POST) 
    if user_pass.is_valid(): # If it is valid at all 
     cleaned_info = user_pass.cleaned_data 
     email_bbn = cleaned_info['username'].split("@") 
     if 'bbns.org' in email_bbn: # Check if BBN email address 
      user_object = User.objects.filter(email = cleaned_info['username']) 
      if user_object.exists(): 
       logged_in_user = auth.authenticate(username=cleaned_info['username'], password=cleaned_info['password']) 
       #add in is_active 
       if logged_in_user is not None: #If password is right 
        if user_object[0].get_profile().activated: 
         auth.login(request, logged_in_user) 
         return HttpResponseRedirect("") 
        else: 
         return HttpResponse("not_act") 
       else: 
        er.append("Incorrect Password") 
      else: # If new user 
       new_user_pass = new_user(request.POST) 
       if new_user_pass.is_valid(): 
        cleaned_info_new = new_user_pass.cleaned_data 
        if cleaned_info_new['password'] == cleaned_info_new['password2']: 
         msg = "In order to activate your account at Knights of the Round Table, please click on this link:" 
         try: 
          send_mail('Activate', msg, '[email protected]', [cleaned_info_new['username']], fail_silently=False) 
          new_user_object = User.objects.create_user(
           username=cleaned_info_new['username'], 
           password=cleaned_info_new['password'], 
           email=cleaned_info_new['username'] 
          ) 
          new_user_profile = new_user_object.get_profile() 
          new_user_profile.pen_name = cleaned_info_new['pen_name'] 
          new_user_profile.activated = False; 
          new_user_profile.save() 
          return HttpResponse("not_act") 
         except: 
          er.append("Error Sending Email") 
        else: 
         er.append('Passwords are not the same') 
       elif "TN" in request.POST: #If open but not filled in 
        print "TN" 
        er.append(new_user_pass.pen_name.error_messages) 
       else: # if new user field 
        print "n_usr" 
        return HttpResponse('n_usr') 
     else: 
      er.append("BBN email addresses only") 
    else: 
     for e in user_pass.errors: 
      er.append(e) 
    errors_template = Template("{% for e in errors %}<li>{{ e }}</li> {% endfor %}") 
    errors_html = errors_template.render(Context({'errors':er})) 
    return HttpResponse(errors_html) 

我尝试两次_1的存取错误。一旦在else上看到右端为for循环,并且从elif 'TN'...上看到两个else上一个返回无效的字段(所以我得到user_name或pen_name)。另一个说,表单没有对象pen_name或我用它的任何东西。

+0

那么问题是什么? – 2012-08-07 15:13:15

回答

1

将错误添加到实际表单会更好。表单附有一个_errors字典,其中包含表单生成的所有错误。 “非现场错误”(与现场或与多个字段无关的错误)进入form._errors['__all__']。所有特定领域的错误都进入了该领域名称的关键。因此,foo字段的错误将发生在form._errors['foo']

现在,_errors字典中每个项目的错误列表实际上是ErrorList类型,而不是标准列表。因此,错误添加到窗体你做:

from django.forms.util import ErrorList 

form._errors.setdefault('foo', ErrorList()).append('Some error here') 

或者,要添加错误非现场错误:

form._errors.setdefault('__all__', ErrorList()).append('Some error here') 

然后,当你的形式呈现,该错误会都属于自然就像任何正常的验证错误一样。

1

该数组可能看起来像错误[i] .field [i] .error,所以你只是调用字段名而不是错误消息。在您的Template()函数中调用e.error。