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
有没有办法像检查用户名一样使其也检查电子邮件地址?
答案 0 :(得分:0)
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
唯一性是由数据库上的约束集强制执行的(可能是因为models.py中的unique=True
),所以这是引发错误的地方,而Django在尝试进行事务处理之前不会意识到这一点。
尽管您通常不希望电子邮件字段具有唯一性,但不一定是唯一的。
编辑:您可以像这样天真email=email
来做一些更健壮(但完全可选)的事情:
email_field = self.model.get_email_field_name()
duplicate = self.filter(**{email_field: email})