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)
现在我的目标是将表单错误传递给模板。例如,我检查password
与password_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的主要内容,如果未能解决你的问题,请参考以下文章