django输入元素错误css类

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 表单代码即可提供所需的界面。

【讨论】:

在表单或小部件级别有什么可以做的吗?这似乎相当冗长,我希望在每个无效输入字段、文本区域、选择...上都有这个错误类

以上是关于django输入元素错误css类的主要内容,如果未能解决你的问题,请参考以下文章

当我的模型状态无效时,如何向输入元素添加 CSS 类?

reCAPTCHA 成功时从元素中删除 css 类 - Nextjs

将css类上的日期选择器应用于多个输入元素但失败

将引导程序和自定义 css 应用于 django 中的 form 元素

Django Pagination 损坏了所有 .css 和 .js 元素的所有路径

如何覆盖 django AuthenticationForm 输入 css 类?