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_class
或error_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类的主要内容,如果未能解决你的问题,请参考以下文章
reCAPTCHA 成功时从元素中删除 css 类 - Nextjs
将引导程序和自定义 css 应用于 django 中的 form 元素