我刚刚创建了一个自定义用户模型和一个自定义用户管理器。我可以使用manage.py createsuperuser创建超级用户,但是在管理面板上进行更新,删除甚至创建新用户时,我都遇到了这个奇怪的错误:
没有NULL约束失败:users_user.email
我不知道如何解决它,只是卡住了。这是我的模特和我的经理:
class UserManager(BaseUserManager):
#custom create_user method
def create_user(self, email, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email = self.normalize_email(email)
)
print(email)
user.set_password(password)
user.save(using=self._db)
print(user)
return user
#Custom create_super_user method
def create_superuser(self, email, password=None):
user = self.create_user(
email = email,
password = password
)
user.admin = True
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user
class User(AbstractBaseUser):
#setting up Choices for interest, Must add other fields ...
#interests = MultiSelectField(
# max_length = 2,
# choices = INTERESTS_CHOICES
#)
#Setting up a Ranking System
email = models.EmailField(
max_length=50,
unique=True,
blank=False,
null=False
)
username = models.CharField(
max_length=25,
unique=True,
null=True,
blank=True
)
date_joined = models.DateTimeField(auto_now_add=True)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=70)
birth_date = models.DateField(null=True, blank=True)
reputation = models.PositiveIntegerField(default=0)
active = models.BooleanField(default=True)
rank = models.CharField(choices=RANKING_CHOICES, max_length=5, default="basic")
is_staff = models.BooleanField(default=False)
admin = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
bio = models.TextField(
max_length=300,
default="default Bio",
blank=True
)
objects = UserManager()
#Setting email to be the main source of authentication
USERNAME_FIELD = 'email'
#Super User Only
REQUIRED_FIELDS = ['password']
#def get_absolute_url(self):
#use reverse + nom de l'url de view
def __str__(self):
return str(self.email)
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
def get_short_name(self):
return self.first_name
def get_username(self):
return self.username
def set_user_league(self):
if 15 <= self.reputation < 40:
self.rank = "gold"
elif 40 <= self.reputation < 80:
self.rank = "platinium"
else:
self.rank = "diamond"
@property
def is_admin(self):
print(f" is {self.email} admin ? ")
return self.admin
def has_perm(self, obj=None):
return True
def has_module_perms(self, obj=None):
return True
我该怎么办?我被困了几个小时。谢谢 !
答案 0 :(得分:0)
使您的模型与用户模型成为OneToOne关系。然后使用null=True