代码之家  ›  专栏  ›  技术社区  ›  Aditya Singh

在创建超级用户功能之前发出保存后信号

  •  1
  • Aditya Singh  · 技术社区  · 8 年前

    我陷入了一些不寻常的问题,需要根据不同的用户类型创建配置文件 例如,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)
    

    我现在面临的问题是,一旦创建了用户,上面的信号就会立即触发,同时也会为超级用户创建配置文件

    有没有一种方法可以避免为超级用户创建配置文件?

    非常感谢。

    1 回复  |  直到 8 年前
        1
  •  0
  •   trantu    8 年前

    将为管理员创建配置文件的原因是您使用 create_user 在里面 create_superuser 。首先将保存一个普通用户。这里为每个人创建了配置文件。此用户将被两次修改为admin。你应该在你的 创建超级用户 功能:

     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()

    之后 if not instance.is_admin …但这种方式并不优雅