django - Django如何让createsuperuser检查重复的电子邮件地址
问题描述
def create_superuser(self, username, email, password=None):
user = self.create_user(
username, email, password=password
)
user.is_admin = True
user.is_staff = True
user.active = True
user.save(using=self._db)
return user
我制作了一个自定义用户模型。当我调用createsuperuser时,如果我输入的用户名已经在数据库中,会提示
'Error: That username is already taken.'
但是如果我输入了一个已经存在于数据库中的电子邮件地址,它不会提示电子邮件已被占用错误。相反,它让我通过并在我输入密码后给了我以下错误:
django.db.utils.IntegrityError: UNIQUE constraint failed: users_customuser.email
有没有办法让它像检查用户名一样检查电子邮件地址?
解决方案
def create_superuser(self, username, email, password=None):
duplicate = self.filter(email=email) # I'm assuming `self` is User.objects
if len(duplicate) != 0:
return "Duplicate email" # Customize your error handling logic here
user = self.create_user(
username, email, password=password
)
user.is_admin = True
user.is_staff = True
user.active = True
user.save(using=self._db)
return user
唯一性是由数据库中的约束集强制执行的(可能是因为unique=True
在 models.py 中),所以这就是引发错误的地方,Django 直到尝试事务才意识到它。
如果您不希望它是唯一的,则电子邮件字段不一定必须是唯一的,尽管这是一种常见的做法。
email=email
编辑:你可以做一些更健壮(但完全可选)的事情,而不是天真,像这样:
email_field = self.model.get_email_field_name()
duplicate = self.filter(**{email_field: email})