我已经搜索了相关的SO帖子和Django文档,无法让它发挥作用。我的表格:
from django import forms
class SignUpForm(forms.Form):
(...)
email = forms.EmailField(max_length=50)
email_conf = forms.EmailField(max_length=50)
def clean(self):
form_data = self.cleaned_data
if form_data['email'] != form_data['email_conf']:
self._errors['email_conf'] = 'Emails do not match.' # attempt A
self.add_error('email', 'Emails do not match.') # attempt B
raise forms.ValidationError('Emails do not match.') # attempt C
return form_data
如果电子邮件不匹配,我希望Django以与其他验证相同的方式使用我的消息字符串 - 作为&{下面的<li>
的{{1}}元素#39; email_conf&#39;字段。
从上面的三次尝试中,实际上似乎只做一些事情的是#A,但是消息作为普通字符串(而不是列表项)插入到<ul class='errorlist'>
模板中。
其他两次尝试都没有做任何事情,并且在所有情况下,如果任一字段为空,Django现在抛出{{ form.email_conf.errors }}
。
很想知道实现我之后的结果的正确方法是什么。谢谢!
答案 0 :(得分:2)
看起来您应该使用表单的error_class方法,例如示例here。您还应该从cleaning_data dict中删除'email_conf'元素。确保清理数据中存在所有密钥(这些密钥在之前的验证步骤中得到验证)也非常重要。
def clean(self):
cleaned_data = super(SignUpForm, self).clean()
email = cleaned_data.get('email')
email_conf = cleaned_data.get('email_conf')
if email and email_conf and email != email_conf:
self._errors['email_conf'] = self.error_class(['Emails do not match.'])
del self.cleaned_data['email_conf']
return cleaned_data