Django 在创建超级用户功能之前触发Post save信号

Django 在创建超级用户功能之前触发Post save信号,django,django-models,django-admin,django-signals,Django,Django Models,Django Admin,Django Signals,我遇到了一些不寻常的问题,需要根据不同的用户类型创建配置文件 超级用户不能有个人资料,而其他用户可以有个人资料 我有自己的用户模型,它扩展了基本用户管理器 class MyUserManager(BaseUserManager): def create_user(self, username=None, email=None, password=None): """ Creates and saves a User with the given usern

我遇到了一些不寻常的问题,需要根据不同的用户类型创建配置文件 超级用户不能有个人资料,而其他用户可以有个人资料

我有自己的用户模型,它扩展了基本用户管理器

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\u superuser
中使用了
create\u user
。首先,将保存一个普通用户。在这里,将为每个用户创建配置文件。至少两次,此用户将被修改为管理员。您应该在
create\u 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

如果instance.is_admin:
UserProfile.objects.filter(用户=实例).delete()


如果不是实例,则在
之后。。。但是这种方式并不优雅

将为管理员创建配置文件的原因是因为您在
创建超级用户
中使用了
创建用户
。首先,将保存一个普通用户。在这里,将为每个用户创建配置文件。至少两次,此用户将被修改为管理员。您应该在
create\u 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

如果instance.is_admin:
UserProfile.objects.filter(用户=实例).delete()


如果不是实例,则在
之后。。。但是这种方式并不优雅

hm,我不理解你的问题,因为你已经回答了
如果不是实例。is_admin:
在你的问题上,它进入了该块,即使它不是超级用户实例。is_admin在创建超级用户时是假的..虽然它应该是真的,我不明白你的问题,因为你已经回答了
如果不是实例。is_admin:
在你的问题上,它进入了该块,即使它对superuserinstance不适用。is_admin在创建superuserinstance时为false。虽然它应该是真的,为什么要删除配置文件…难道没有一个方法可以避免创建配置文件吗对于超级用户..重点是不要在第一个位置创建TypeError:create_user()得到了一个意外的关键字参数'is_admin'为什么第二种方法不优雅?每个
create_superuser()
new_user_receiver
发出两个信号,第一个是普通用户,第二个是超级用户。首先,为超级用户创建一个profile。应为超级用户删除两次创建的配置文件。它不是优雅的,因为你必须检查两次。为什么要删除配置文件…我不是可以避免为超级用户创建配置文件的一个转折点吗..重点是不要首先创建TypeError:create_user()得到了一个意外的关键字参数'is_admin'为什么第二种方式不优雅?Every
create_superuser()
以相同的实例向
新用户\接收器发射两个信号,一开始是普通用户,另一次是超级用户。首先,为超级用户创建一个profile。应为超级用户删除两次创建的配置文件。它不优雅,因为你必须检查两次。