Django 将自定义表单错误添加到 form.errors

Posted

技术标签:

【中文标题】Django 将自定义表单错误添加到 form.errors【英文标题】:Django add custom form errors to form.errors 【发布时间】:2016-01-19 04:25:24 【问题描述】:

我想写一个表单来注册用户。我想实现一个密码匹配,用户必须输入他的密码两次。这是我目前的表格:

from django import forms
from passwords.fields import PasswordField

class AccountForm(forms.Form):
    email = forms.EmailField(max_length=255)
    username = forms.CharField(max_length=40)
    password = PasswordField(label="Password")
    password_confirm = PasswordField(label="Password")

在我看来,我想检查验证,如果某些内容无效,我想在模板中打印特定错误。这是我目前的观点:

def signup(request):
    if request.method == 'POST':
        form = AccountForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data['email']
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            password_confirm = form.cleaned_data['password_confirm']

            if password != password_confirm:
                print("Password don't match")

            #Account.objects.create_user(email, password, username = username)

        else:
            print(form.errors)
            form = Account()
    return render(request, 'authentication/auth.html', 'signup': form)

现在我的目标是将表单错误传递给模板。例如,我检查passwordpassword_confirm 变量的匹配。如果它们不匹配,我希望它在模板中可见。你们知道如何将我的自定义表单错误/验证添加到我的表单并在我的模板中显示这些错误吗?

【问题讨论】:

【参考方案1】:

为此,您需要使用clean 方法。

class AccountForm(forms.Form):
    email = forms.EmailField(max_length=255)
    username = forms.CharField(max_length=40)
    password = PasswordField(label="Password")
    password_confirm = PasswordField(label="Password")

    def clean(self):
        cd = self.cleaned_data
        if cd.get('password') != cd.get('password_confirm'):
            self.add_error('password_confirm', "passwords do not match !")
        return cd

现在,当从您的视图调用form.is_valid() 时,会隐式调用表单的clean 方法并执行此验证。

阅读此内容:clean values that depend on each other 了解更多信息。

请注意,您的 Form.clean() 覆盖引发的任何错误都不会 特别与任何领域相关联。他们进入一个特殊的 “field”(称为all),您可以通过 如果需要,可以使用 non_field_errors() 方法。如果要附加错误 到表单中的特定字段,您需要调用add_error()

另外,请注意.add_error 是在 django 1.7 中引入的。

如果你使用 django 1.6 或更低版本,你会这样做:

if cd.get('password') != cd.get('password_confirm'):
    self._errors["password_confirm"] = self.error_class(["Passwords do not match"])
    del cleaned_data["password_confirm"]

【讨论】:

哇,这真是太棒了!我不知道 clean 方法可以做到这一点:D 非常感谢! 使用ModelForms 似乎可以减少很多代码 - 鼓励您阅读。 如果您需要使用比简单验证器更复杂的逻辑,这在与the ability to capture the output of the ValidationError 结合使用时非常有用。 except ValidationError as ve: self.add_error("field", ve) 之类的东西(但用适当的换行符格式化)【参考方案2】:
class AccountForm(forms.Form):
    ....your stuff

    def clean_password(self):
        if self.data['password'] != self.data['password_confirm']:
            raise forms.ValidationError('Passwords are not the same')
        return self.data['password']

【讨论】:

以上是关于Django 将自定义表单错误添加到 form.errors的主要内容,如果未能解决你的问题,请参考以下文章

Django将自定义查询集添加到ListView中

如何将自定义 CSS 添加到清晰的表单中?

如何将自定义字段添加到 WooCommerce 注册表单

Django 将自定义表单参数传递给 ModelFormset

将自定义占位符添加到 django-cms

将自定义按钮添加到 django cms ckeditor