我的页面有一个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'
也许只有"清洁"当时有一个领域?还有另一种方法吗?
答案 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