【问题标题】:django input element error css classdjango输入元素错误css类
【发布时间】:2011-01-12 21:34:33
【问题描述】:

我想知道当表单验证失败时如何将 .error 类添加到输入元素 (to registration app)。

【问题讨论】:

    标签: python django validation django-forms


    【解决方案1】:

    如果您想将错误 CSS 类放置到表单输入小部件(而不是它们的容器),您可以从以下类派生您的表单类:

    class StyledErrorForm(forms.Form):
         def is_valid(self):
             result = super().is_valid()
             # loop on *all* fields if key '__all__' found else only on errors:
             for x in (self.fields if '__all__' in self.errors else self.errors):
                 attrs = self.fields[x].widget.attrs
                 attrs.update({'class': attrs.get('class', '') + ' is-invalid'})
             return result
    

    【讨论】:

    • 但要注意一个小问题——这会覆盖在字段小部件声明中指定的任何类(即attrs)。要简单地附加错误类,请改用这一行(有点可怕):self.fields[f].widget.attrs.update({'class': self.fields[f].widget.attrs.get('class', '') + ' error'})
    • 您的回答不完整,您忘记了__all__ 键。我已经编辑了你的答案,如果你不喜欢它,请告诉我。
    【解决方案2】:

    使用自定义模板...

    使用内置的 Django 错误分类解决方案我个人从来没有太多运气,此外,我喜欢在错误上使用内置的“striptags”模板过滤器,以摆脱所有我无法弄清楚的 html 列表内容无论如何如何渲染得很好。

    我使用以下自定义模板将它们归类为“error_id”。

    @register.filter(is_safe=True)
    @stringfilter
    def error_id(value):
        if value=='':
            return ''
        else:
            return r'<span class="error_id">'+value+'</span>'
    

    使用以下方法呈现模板中的各个错误:

    {{ form.my_field.errors|striptags|error_id}}
    

    或者使用类似的东西渲染整个表单:

        <table border="1" cellpadding="5px" align="center">
            {% for field in form.visible_fields %}
                <tr>
                            <td> {{ field.label_tag }}: </td>
                            <td>    {{ field }}  </td>
                            <td> {{ field.errors|striptags|error_id }} </td>
                </tr>
    
            {% endfor %}
    
        </table>
    

    【讨论】:

    • 我使用{{ field.errors.join:" " }} 代替ul 在内联显示错误。而且没有 HTML 的东西。
    • 您可以从 django.template.defaultfilters.stiptags 的过滤器中调用 striptags
    【解决方案3】:

    现在很容易——Django 1.2 中的新功能

    只需在表单类上添加一个属性即可。文档中的“1.2 中的新功能”注释下提到了此功能,但您可以在 django.forms.forms.BoundField.css_classes 找到魔法这里是 API reference,以及一个示例:

    class MyForm(forms.Form):
        required_css_class = "required"
        error_css_class = "error"
    

    【讨论】:

    • 我正在运行 1.3 并且这些类都没有出现在模板输出中。我在 for 循环中使用简单的 {{ field }} 渲染该字段。我必须做些什么特别的事情才能完成这项工作?是不是只在输出表格的时候有效?
    • 您需要使用 {{ form }} 输出整个表单,如果您这样做,您将看到任何格式(p、表格和列表)的类。
    • @BrianFisher 根据您的回答,这是否意味着要么接受 {{form}} 以获得所需的错误/所需的类,要么如果您想更好地控制整个表单和出错的类,则构建自己的元素?
    • 是的,当使用{{ form }} 输出时,添加required_css_classerror_css_class 只会影响输入标签和字段周围的容器元素。它确实 not 将类添加到输入字段本身(这是 OP 想要的)。 Here are the docs for Django 1.7
    • Django 3.x:如果您覆盖 clean() 方法,并在该方法中,通过 self.add_error() 添加错误(引发 ValidationError() 异常),error_css_class忽略。不要问我为什么。在这种情况下,这个答案不起作用,而卢卡的答案完美无缺。
    【解决方案4】:

    (迟到总比没有好)

    你应该可以用Django Uni Form做到这一点

    【讨论】:

      【解决方案5】:

      这可以完全通过您的模板完成。

      您为要测试的每个表单域构建表单模板,您可以使用以下示例构造

      <input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/>
      

      这让您无需修改​​视图和 django 表单代码即可提供所需的界面。

      【讨论】:

      • 在表单或小部件级别有什么可以做的吗?这似乎相当冗长,我希望在每个无效输入字段、文本区域、选择...上都有这个错误类
      猜你喜欢
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多