【发布时间】:2011-01-12 21:34:33
【问题描述】:
我想知道当表单验证失败时如何将 .error 类添加到输入元素 (to registration app)。
【问题讨论】:
标签: python django validation django-forms
我想知道当表单验证失败时如何将 .error 类添加到输入元素 (to registration app)。
【问题讨论】:
标签: python django validation django-forms
如果您想将错误 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__ 键。我已经编辑了你的答案,如果你不喜欢它,请告诉我。
使用自定义模板...
使用内置的 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 1.2 中的新功能
只需在表单类上添加一个属性即可。文档中的“1.2 中的新功能”注释下提到了此功能,但您可以在 django.forms.forms.BoundField.css_classes 找到魔法这里是 API reference,以及一个示例:
class MyForm(forms.Form):
required_css_class = "required"
error_css_class = "error"
【讨论】:
{{ form }} 输出时,添加required_css_class 或error_css_class 只会影响输入标签和字段周围的容器元素。它确实 not 将类添加到输入字段本身(这是 OP 想要的)。 Here are the docs for Django 1.7
clean() 方法,并在该方法中,通过 self.add_error() 添加错误(引发 ValidationError() 异常),error_css_class 被忽略。不要问我为什么。在这种情况下,这个答案不起作用,而卢卡的答案完美无缺。
(迟到总比没有好)
你应该可以用Django Uni Form做到这一点
【讨论】:
这可以完全通过您的模板完成。
您为要测试的每个表单域构建表单模板,您可以使用以下示例构造
<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/>
这让您无需修改视图和 django 表单代码即可提供所需的界面。
【讨论】: