【问题标题】:Django add custom form errors to form.errorsDjango 将自定义表单错误添加到 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 变量的匹配。如果它们不匹配,我希望它在模板中可见。你们知道如何将我的自定义表单错误/验证添加到我的表单并在我的模板中显示这些错误吗?

【问题讨论】:

    标签: django django-forms django-validation


    【解决方案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']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 2011-04-25
      • 2016-09-20
      • 2016-05-29
      相关资源
      最近更新 更多