附加到 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 表单验证错误?的主要内容,如果未能解决你的问题,请参考以下文章

将 Django 模型验证错误传输到表单的惯用方式

在一个 django 表单元素上覆盖数据验证

Django:模板中的 Crispy 表单验证错误

Django“自动对焦”表单验证错误

为啥我的 Django 表单没有引发验证错误?

Django Formset管理-表单验证错误