【问题标题】:Identify the nature of field error in django forms识别 django 表单中字段错误的性质
【发布时间】:2011-08-25 03:23:20
【问题描述】:

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,我不想尝试自定义。

【问题讨论】:

    标签: django-templates django-forms


    【解决方案1】:

    希望您在 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%}
    

    消息将像这样打印在您的登录页面上

    需要用户名 需要密码

    用户名和密码错误

    【讨论】:

      【解决方案2】:

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

      我认为这样的事情应该可行:

      你需要做的就是像这样覆盖 clean_username 方法: 编辑:

      由于form and field validation docs 中的以下原因,覆盖 clean_username 方法无法更改验证错误消息:

      • 字段上的 clean() 方法 子类。这是负责 运行 to_python,验证和 以正确的顺序运行验证器 并传播他们的错误。如果,在 任何时候,任何方法都会引发 ValidationError,验证停止 并引发了该错误。这种方法 返回干净的数据,然后 插入到cleaned_data 形式的字典。

      • clean_&lt;fieldname&gt;() 方法在 表单子类——在哪里 替换为表单的名称 字段属性。这个方法做任何 特定于那个的清洁 特定属性,与 它是字段的类型。这种方法 没有传递任何参数。你会 需要查找字段的值 在 self.cleaned_data 并记住 这将是一个 Python 对象 点,而不是原始字符串 以表格形式提交(它将在 clean_data 因为通用字段 上面的 clean() 方法已经 清理数据一次)。

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

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

      >>> 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, }),
          ...
      

      【讨论】:

      • 谢谢,这似乎是一种明智的做法。 :-)
      • 我试过了,但我仍然只得到默认的“此字段是必需的错误”。我刚刚使用与上述示例完全相同的登录名编写了自己的 clean_username 和 clean_password,但似乎不起作用。有什么线索吗?
      • 你有没有把认证表单传给urlconf中的视图?
      • 是的,我将authentication_form 参数设置为我的自定义表单。但是默认验证似乎仍然有效。我不确定调用验证函数的顺序以及如果引发一个异常会发生什么。
      • 好的,我想我明白了为什么您无法使用上述方法更改验证错误。编辑答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 2016-10-20
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多