python - 如何在Django中自动为注册到平台的新用户创建用户配置文件

标签 python django django-models django-rest-framework django-signals

我使用自定义用户模型employeeProfile创建了一个模型文件,其中包含员工个人资料的详细信息,以及一个用于自动为新用户创建个人资料的信号文件。尽管我已经设置了此设置,但不会自动创建新用户配置文件,迫使我在管理页面中手动添加它们。 请协助解决。

models.py 文件如下所示

(...) # imports
class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(
        default=datetime.now, blank=True)  # To add then run migrations

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['name']  # email is already required, no need to add

    def get_full_name(self):
        return self.name

    def get_short_name(self):
        return self.name

    def __str__(self):
        return self.email


# Employees profile
class employeeProfile(models.Model):
    user = models.OneToOneField(
        CustomUser, on_delete=models.CASCADE, related_name="profile")
    description = models.TextField(blank=True, null=True)
    location = models.CharField(max_length=30, blank=True)
    Department = models.CharField(max_length=30, blank=True)
    Job_title = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)
    is_manager = models.BooleanField(default=False)

    def __str__(self):
        return self.user.name

CustomUserManager 文件

class CustomUserManager(BaseUserManager):

    def create_user(self, email, name, password=None):
        if not email:
            raise ValueError("Users must have an email address")

        email = self.normalize_email(email)
        user = self.model(email=email, name=name)

        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, email, name, password):
        user = self.create_user(email, password)

        user.is_superuser = True
        user.is_staff = True
        user.save()

        return user

Signal.py文件

(...) # other imports
from django.contrib.auth import get_user_model
User = get_user_model()

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        employeeProfile.objects.create(user=instance)

注意:我已在帐户中注册信号

from django.apps import AppConfig

class AccountsConfig(AppConfig):
    name = 'accounts'

    def ready(self):
        import accounts.signals

最佳答案

如果您正确设置信号,它应该可以满足您的要求。

信号的正确设置是您必须更新 apps.py

例如:

apps.py

class MyAppConfig(AppConfig):
  name='myapp'

  def ready(self):
     # import your signal file in here if the app is ready
     from . import receivers

最后通过导入您的 apps.py 来更新应用程序 init.py:

例如

default_app_config='myapp.apps.MyAppConfig'

关于python - 如何在Django中自动为注册到平台的新用户创建用户配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63057047/

相关文章:

python - 使用 URL 将模型设置为 true 或 false

Django Rest 框架,如何在 ModelSerializer 中包含 '__all__' 字段和相关字段?

python - 如何在 Celery-Django 应用程序中监视来自 worker 的事件?

python - macOS Sierra 安装 PyQt5 for python2.7

Python 列表中浮点的成员资格

django - 为 django 评论表单分配唯一 ID

python - 如何将 Django 模型列的值映射到列表?

python - Django CASCADE 和 post_delete 交互

django - 查询 Django 中的前 x 个元素

python - 元类与单继承冲突