Python django输入元素错误css类

Python django输入元素错误css类,python,django,validation,django-forms,Python,Django,Validation,Django Forms,我想知道当表单验证失败时,如何向输入元素添加.error类 这完全可以通过模板完成 为要测试的每个表单字段构建表单模板,可以使用以下示例构造 <input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/> 这使您可以在不修改view&django表单代码的情况下提供所需的界面。迟做总比不做好 您应该能够使用现在很容易做到这一点-Django 1.2中的新功能 只需在form类上

我想知道当表单验证失败时,如何向输入元素添加.error类

这完全可以通过模板完成

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

<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/>
这使您可以在不修改view&django表单代码的情况下提供所需的界面。

迟做总比不做好


您应该能够使用

现在很容易做到这一点-Django 1.2中的新功能

只需在form类上添加一个属性,就可以了。文档中在1.2中的一个新注释中提到了此功能,但您可以在django.forms.forms.BoundField.css_类中找到其神奇之处,以下是示例:

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

如果要将错误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

使用自定义模板

就个人而言,使用内置的Django错误分类解决方案从来没有多少运气,此外,我喜欢在错误上使用内置的“striptags”模板过滤器,以消除所有html列表内容,我不知道如何很好地呈现这些内容

我使用以下自定义模板将它们分类为“error\u id”

@register.filter(is_safe=True)
@stringfilter
def error_id(value):
    if value=='':
        return ''
    else:
        return r'<span class="error_id">'+value+'</span>'
或者使用以下方法渲染整个表单:

    <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>

有什么可以在表单或小部件级别上完成的吗?这看起来相当冗长,我希望在每个无效的输入字段、textarea、select上都有这个错误类……我正在运行1.3,这些类都不在模板输出中。我在for循环中使用简单的{field}来呈现这个字段。我有什么特别的事要做吗?它只在输出表时起作用吗?您需要使用{{form}输出整个表单,如果这样做,您将看到p、table和list格式的类。@BrianFisher根据您的回答,这是否意味着接受{{form}如果您想更好地控制整个表单和出错时的类,那么要获得所需的error/required类还是构建自己的元素?是的,添加required_css_类或error_css_类只会在使用{{form}输出时影响输入标签和字段周围的容器元素。它不会将类添加到OP想要的输入字段本身。Django 3.x:如果重写clean方法,并在该方法中通过引发ValidationError异常的self.add_error添加错误,则会忽略error_css_类。别问我为什么。在这种情况下,这个答案不起作用,而Luca的答案却完美无瑕。您可以从django.template.defaultfilters.StipTags中调用过滤器中的striptags,但要注意一个小问题,-这会覆盖字段小部件声明中指定的任何类,即attrs。要简单地附加错误类,请使用这一行:self.fields[f].widget.attrs.update{'class':self.fields[f].widget.attrs.get'class',+'error'}您的答案不完整,您忘记了_uall_u_u_u_u键。我编辑了你的答案,如果你不喜欢,请告诉我。
    <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>