确定django表单中字段错误的性质

时间:2011-05-13 17:41:37

标签: django-templates django-forms

django中的表单字段可以具有的两种类型的验证错误是“必需”和“无效”。有没有办法从模板中找出这两个错误中的哪一个发生了?像

这样的东西
{% if form.username.errors %}
{% for error in form.username.errors %}
{% if error.required %}
Please enter the username
{% else %}
{{ error }}
{% endif %}

我只想覆盖“必需”错误的错误消息,即,如果发生错误,我想显示自己的错误消息。我使用的django.contrib.auth.views使用django.contrib.auth.forms.AuthenticationForm,我不想尝试自定义。

2 个答案:

答案 0 :(得分:2)

希望您在html模板中搜索此类句柄

{% for x in form.errors %}
    {%if "__all__" in x %}
        Wrong username and password
    {%else%}
        {%if "username" in x %}
            Requires username
            <br>
        {%endif%}
        {%if "password" in x %}
            Requires Password
            <br>
        {%endif%}
    {%endif%}
{%endfor%}

邮件将在您的登录页面上以这样的方式打印

需要用户名 需要密码

用户名和密码错误

答案 1 :(得分:1)

您真的应该覆盖身份验证表单。视图接受一个允许您轻松覆盖表单的参数。

我认为这样的事情应该有效:

您需要做的就是覆盖clean_username方法,如下所示: 编辑:

由于form and field validation docs中的以下内容,

覆盖clean_username方法无法更改验证错误消息:

  
      
  • Field上的clean()方法   子类。这是负责任的   运行to_python,验证和   run_validators按正确的顺序排列   并传播他们的错误。如果,在   任何时候,任何方法提出   ValidationError,验证停止   并且引发了该错误。这种方法   返回干净的数据,然后   插入到cleaning_data中   表格字典。

  •   
  • a中的clean_<fieldname>()方法   表单子类 - 在哪里   替换为表单的名称   字段属性。这种方法可以做到   清洁是特定的   特殊属性,与...无关   它的字段类型。这种方法   没有传递任何参数。你会   需要查看该字段的值   在self.cleaned_data并记住这一点   它将是一个Python对象   点,不是原始字符串   以表格提交(将在   cleaning_data因为一般字段   上面的clean()方法已经有了   清理数据一次。)

  •   

首先验证Field子类,并返回用于clean_<field_name>()方法的已清理数据。如果发生错误,则该字段的验证将停止。

这意味着要覆盖消息,您需要覆盖字段验证或使字段不需要值,因此在该步骤中不会引发验证错误并在clean_<fieldname>()方法中引发所需方法

>>> from django.contrib.auth.forms import AuthenticationForm
>>> class MyAuthForm(AuthenticationForm):
...     def __init__(self, *args, **kwargs):
...         super(MyAuthForm, self).__init__(*args,**kwargs)
...         self.fields['username'].error_messages['required']='Custom Required Msg'
... 
>>> form = MyAuthForm(data={'password':'asdf'})
>>> form.is_valid()
False
>>> form.errors
{'username': [u'Custom Required Msg']}
>>> 

urls.py

from someapp.forms import MyAuthForm

urlpatterns = patterns('',
    ...
    (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'someapp/login.html', 'authentication_form':MyAuthForm, }),
    ...