附加到 Django 表单验证错误?
Posted
技术标签:
【中文标题】附加到 Django 表单验证错误?【英文标题】:Append to Django Form Validation Error? 【发布时间】:2015-03-14 07:35:17 【问题描述】:我在 Django 1.6 中使用了自定义验证错误,它运行良好;但是,我一次只能显示一个错误。如果“if”语句中的条件失败,我该如何显示所有错误?
forms.py
class BaseNameFormSet (BaseFormSet):
...
...
...
if (firstname in firstnames) or (lastname in lastnames):
raise forms.ValidationError ('First or last name must be unique')
if (firstname == '') or (lastname == ''):
raise forms.ValidationError ('Both first and last name must be filled out')
addname.html
...
...
...
% if formset.non_form_errors %
<b>Please correct the error below:</b>
<ul>
% for error in formset.non_form_errors %
<li><p style="color: red;"> error </p></li>
% endfor %
</ul>
【问题讨论】:
【参考方案1】:您可以声明一个填充了错误的变量,然后在最后显示一次。
class BaseNameFormSet (BaseFormSet):
...
...
...
if (firstname in firstnames) or (lastname in lastnames):
error_msg='First or last name must be unique'
if (firstname == '') or (lastname == ''):
error_msg+='<br>Both first and last name must be filled out'
if error_msg:
raise forms.ValidationError(error_msg)
【讨论】:
好主意。我会看看这两个中哪一个最适合我的情况。谢谢!!【参考方案2】:如果您能够升级到 Django 1.7,您可以通过将列表传递给 ValidationError
构造函数来raise multiple errors。
errors = []
if (firstname in firstnames) or (lastname in lastnames):
errors.append('First or last name must be unique')
if (firstname == '') or (lastname == ''):
errors.append('Both first and last name must be filled out')
if errors:
raise ValidationError(errors)
请注意,您通常不必进行if firstname == ''
之类的检查,只需将firstname
设为必填字段即可。您可能会发现 this question 关于在需要有用的表单集中制作表单。
【讨论】:
此时升级到 Django 1.7 并不是一个简单的选择。我看过使用错误列表的文档,但认为有更好的方法。此外,当您有一个空字符串时,Django 中的“必需”字段无法正常工作。它将作为有效形式传递;因此,我不得不这样做。不过,我很感激你的建议。 上述方法对我有用,无需升级。感谢您的帮助! 对于绑定表单,CharFields
将给出空字符串错误。在您的情况下,因为您使用的是表单集,所以您需要检查完全空的、未绑定的表单。我添加了一个您可能会觉得有用的问题的链接。请注意,一旦 Django 1.8 发布 (perhaps in April),对 Django 1.6 的支持将结束,因此您应该考虑尽快升级。
再次感谢阿拉斯代尔。我之前遇到过该链接,但觉得它不适合我的情况。现在它确实如此,我再看看它。干杯!以上是关于附加到 Django 表单验证错误?的主要内容,如果未能解决你的问题,请参考以下文章