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

Zed*_*aid 4 django django-forms django-validation

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

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")
Run Code Online (Sandbox Code Playgroud)

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

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})
Run Code Online (Sandbox Code Playgroud)

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

kar*_*ikr 8

为此,您需要使用该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
Run Code Online (Sandbox Code Playgroud)

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

请继续阅读:clean values that depend on each other了解更多信息.

请注意,Form.clean()覆盖引发的任何错误都不会与任何字段相关联.它们进入一个特殊的"字段"(称为all),如果需要,可以通过non_field_errors()方法访问它.如果要将错误附加到表单中的特定字段,则需要调用add_error().

另外,请注意.add_errordjango 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"]
Run Code Online (Sandbox Code Playgroud)