在Django信号中创建不同配置文件的问题

yqyhoc1h  于 2023-06-07  发布在  Go
关注(0)|答案(1)|浏览(144)

我在我的Django应用程序中遇到了一个问题,我需要根据www.example.com _manager的值创建不同的配置文件,Profile1或Profile2user.is。我使用信号来处理这个逻辑。
以下是问题的摘要:

  • 我有两个模型:配置文件1和配置文件2。Profile1适用于管理员用户,而Profile2适用于非管理员用户。
  • 在我的managers.py文件中,我在user.is创建用户期间将管理器用户的www.example.com _manager设置为True。
  • 但是,当我尝试访问instance.is_managersignals.py时,它始终返回False,尽管根据managers.py中设置的值,它应该是True。
    is_manager字段在数据库中正确设置为True,但在信号处理过程中仍为False

任何建议或见解,以解决这个问题将不胜感激。

# managers.py

from django.contrib.auth.models import BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self, phone, username, email, password):
        user = self.model(phone=phone, username=username, email=email)
        user.set_password(password)
        user.save(using=self.db)
        return user

    def create_superuser(self, phone, username, email, password):
        user = self.create_user(phone, username, email, password)
        user.is_admin = True
        user.is_manager = True # when create a superuser it's a manager too
        user.save(using=self.db)
        return
# apps.py

from django.apps import AppConfig

class PanelConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'panel'

    def ready(self):
        import panel.signals
# signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings

from .models import User
from accounts.models import Profile1, Profile2

@receiver(post_save, sender=User, dispatch_uid="panel.signals.create_profile")
def create_profile(sender, instance, created, **kwargs):
    if created:
        if instance.is_manager: # this returns False
            profile = Profile1.objects.create(user=instance)
        else:
            profile = Profile2.objects.create(user=instance)
            
        profile.save()

我已经检查了我的代码,并验证了user.is_manager在managers.py中正确设置为True。我正在寻找关于为什么instance.is_manager的价值没有在信号中准确捕获的指导。

toiithl6

toiithl61#

用这个代码不用发信号它很简单。。

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self,username, email, phone, password, **extra_fields):
        values = [email]
        field_value_map = dict(zip(self.model.REQUIRED_FIELDS, values))
        for field_name, value in field_value_map.items():
            if not value:
                raise ValueError("The {} value must be set".format(field_name))

        email = self.normalize_email(email)
        user = self.model(email=email, username=username, phone=phone, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        # Profile creating here...
        if user.is_manager: 
            profile = Profile1.objects.create(user=user)
        else:
            profile = Profile2.objects.create(user=user)
        return user

    def create_user(self, email, username, phone, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email,username, phone, password, **extra_fields)

    def create_superuser(self, email, username, phone, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(email, username, phone, password, **extra_fields)

相关问题