Django Forms:如何验证两个字段是否相同,例如电邮或密码?

时间:2014-04-23 17:52:44

标签: python django validation django-forms

我已经搜索了相关的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 }}

很想知道实现我之后的结果的正确方法是什么。谢谢!

1 个答案:

答案 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