一起清理两个表单字段

时间:2014-09-02 11:48:20

标签: django django-forms

我的页面有一个custum注册表单,我试图创建一个干净的方法,可以检查用户在尝试注册时是否感到兴奋。如果他们感到兴奋,他们就不应该看到任何警告。

我的模特:

class Profile(models.Model):
    user = models.OneToOneField(User)
    external_reference = models.CharField(max_length=500, blank=True)

我干净的方法:

def clean_email(self):
    email = self.cleaned_data['email']
    external_reference = self.cleaned_data['external_reference']
    if User.objects.filter(email=email).exists():
        try:
            #User exist, use form to update user
            Profile.objects.get(external_reference=external_reference, user__email=email)
            return email
        except Profile.DoesNotExist:    
            raise forms.ValidationError(u'Email in use')

    return email

我收到此错误:KeyError: 'external_reference'

也许只有"清洁"当时有一个领域?还有另一种方法吗?

1 个答案:

答案 0 :(得分:0)

清理和验证相互依赖的字段

部分的官方文档中查看Form and field validation

正如Rohan评论的那样,你应该在clean()方法中清理彼此依赖的字段。

clean_email 被调用时, external_reference 尚未清理,因为它还没有在 self.cleaned_data 中(因此KeyError异常)。

def clean(self):
    cleaned_data = super(Class, self.clean)
    email = cleaned_data.get('email')
    external_reference = cleaned_data.get('external_reference')
    if email and external_reference:
        if User.objects.filter(email=email).exists():
            try:
                #User exists, use form to update user
                Profile.objects.get(external_reference=external_reference, user__email=email)
            except Profile.DoesNotExist:
                self.add_error('email', 'Email in use')

    return cleaned_data

请记住在 cleaning_data 上使用 get 来获取电子邮件 external_reference 并检查它们是否存在,因为各个 clean_field 方法引发了验证错误,然后它们不在 cleaning_data 中,您将再次获得KeyError。

PS:如果您使用的是1.7之前的django版本,请使用 self._errors ['email'] = self.error_class(['使用中的电子邮件'])而不是 self。 add_error