Post 在创建超级用户函数之前保存信号触发
Post save signal fires before create super user function
我遇到了一些不寻常的问题,需要根据不同的用户类型创建配置文件
例如 .super 不能有个人资料,而其他用户可以有个人资料
我有自己的用户模型,它扩展了基本用户管理器
class MyUserManager(BaseUserManager):
def create_user(self, username=None, email=None, password=None):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('Must include username')
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username = username,
email = self.normalize_email(email),
gender='MALE',
)
user.set_password(password)
user.save(using=self._db)
print user
return user
def create_superuser(self, username, email, password):
"""
Creates and saves a superuser with the given username, email and password.
"""
user = self.create_user(
username=username,
email=email,
password=password,
)
user.is_admin = True
print user, user.is_admin
user.save(using=self._db)
return user
然后使用以下信号创建配置文件
def new_user_receiver(sender, instance, created, *args, **kwargs):
if not instance.is_admin:
print instance , instance.is_admin , not instance.is_admin
new_profile, is_created = UserProfile.objects.get_or_create(user=instance)
else:
pass
post_save.connect(new_user_receiver, sender=MyUser)
我现在面临的问题是,一旦创建用户并为超级用户创建配置文件,就会触发上述信号
有什么方法可以避免为超级用户创建配置文件?
谢谢。
为管理员创建配置文件的原因是因为您在 create_superuser
中使用了 create_user
。首先将保存一个普通用户。这里为每个人创建了配置文件。该用户两次将被修改为管理员。您应该在 create_superuser
函数中调用它:
def create_user(self, username=None, email=None, password=None, is_admin=False):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('Must include username')
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username = username,
email = self.normalize_email(email),
gender='MALE',
is_admin = is_admin,
)
user.set_password(password)
user.save(using=self._db)
print user
return user
def create_superuser(self, username, email, password):
"""
Creates and saves a superuser with the given username, email and password.
"""
user = self.create_user(
username=username,
email=email,
password=password,
is_admin = True,
)
return user
或
if instance.is_admin:
UserProfile.objects.filter(user=instance).delete()
after if not instance.is_admin
...但是这种方式不优雅
我遇到了一些不寻常的问题,需要根据不同的用户类型创建配置文件 例如 .super 不能有个人资料,而其他用户可以有个人资料
我有自己的用户模型,它扩展了基本用户管理器
class MyUserManager(BaseUserManager):
def create_user(self, username=None, email=None, password=None):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('Must include username')
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username = username,
email = self.normalize_email(email),
gender='MALE',
)
user.set_password(password)
user.save(using=self._db)
print user
return user
def create_superuser(self, username, email, password):
"""
Creates and saves a superuser with the given username, email and password.
"""
user = self.create_user(
username=username,
email=email,
password=password,
)
user.is_admin = True
print user, user.is_admin
user.save(using=self._db)
return user
然后使用以下信号创建配置文件
def new_user_receiver(sender, instance, created, *args, **kwargs):
if not instance.is_admin:
print instance , instance.is_admin , not instance.is_admin
new_profile, is_created = UserProfile.objects.get_or_create(user=instance)
else:
pass
post_save.connect(new_user_receiver, sender=MyUser)
我现在面临的问题是,一旦创建用户并为超级用户创建配置文件,就会触发上述信号
有什么方法可以避免为超级用户创建配置文件?
谢谢。
为管理员创建配置文件的原因是因为您在 create_superuser
中使用了 create_user
。首先将保存一个普通用户。这里为每个人创建了配置文件。该用户两次将被修改为管理员。您应该在 create_superuser
函数中调用它:
def create_user(self, username=None, email=None, password=None, is_admin=False):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('Must include username')
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username = username,
email = self.normalize_email(email),
gender='MALE',
is_admin = is_admin,
)
user.set_password(password)
user.save(using=self._db)
print user
return user
def create_superuser(self, username, email, password):
"""
Creates and saves a superuser with the given username, email and password.
"""
user = self.create_user(
username=username,
email=email,
password=password,
is_admin = True,
)
return user
或
if instance.is_admin:
UserProfile.objects.filter(user=instance).delete()
after if not instance.is_admin
...但是这种方式不优雅