电子邮件已经拍摄(尝试/除外)

时间:2016-05-19 07:38:00

标签: django

我想在提交时指导我的用户,已经收到了一封电子邮件。在我订阅的表格上,我有这段代码。

def clean_email(self):
    try:
        emailCheck = User.objects.filter(username=self.cleaned_data['email'])
    except User.DoesNotExist:
        raise ValidationError('Email already exists')

我需要使用try / except,因为当用户插入正确的数据时我遇到了问题。

2 个答案:

答案 0 :(得分:3)

.filter()方法不会引发DoesNotExist异常。您应该使用.get()方法来提出这些例外。

来自Django QuerySet docs:

  如果找不到对象,

get()会引发DoesNotExist异常   给定的参数。此异常是模型的属性   类。

def clean_email(self):
    try:
        emailCheck = User.objects.get(username=self.cleaned_data['email'])
    except User.DoesNotExist:
        raise ValidationError('Email already exists')

注意: 如果您只是想检查具有给定username的用户是否存在,您应该使用.exists()方法(也建议使用@Sayse)。

  

如果QuerySet包含任何结果,则返回TrueFalse   如果没有。

答案 1 :(得分:2)

您应该使用exists

  

如果QuerySet包含任何结果,则返回True,否则返回False。

使用get将返回用户对象,这对于此类验证而言是不必要且性能较低的。

if User.objects.filter(username=self.cleaned_data['email']).exists():
     raise ValidationError('Email already exists')

您可能也有兴趣知道django中的username字段只允许30个字符,这些字符对于电子邮件来说并不能很好地播放。有一个迁移应该可用于Django 1.10,该限制最多可以包含150个字符。