【问题标题】:Append to Django Form Validation Error?附加到 Django 表单验证错误?
【发布时间】: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>

【问题讨论】:

    标签: python html django validation django-forms


    【解决方案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 的支持将结束,因此您应该考虑尽快升级。
    • 再次感谢阿拉斯代尔。我之前遇到过该链接,但觉得它不适合我的情况。现在它确实如此,我再看看它。干杯!
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2013-04-01
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多