【问题标题】:Django Models: Create custom User model when I create a normal UserDjango 模型:创建普通用户时创建自定义用户模型
【发布时间】:2019-10-17 03:58:52
【问题描述】:

我有一个名为“用户配置文件”的模型,它是一个自定义用户,它接受一个 OneToOneField 中的用户,并且还有其他字段,例如“年龄”、“is_teacher”、“is_location”。

我的问题是,当我创建普通用户时,此“用户配置文件”不会创建新用户。我该如何做到这一点?

我知道我必须用接收器做这样的事情(我在哪里添加接收器?):

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

@receiver(post_save, sender=User)
def create_user_data(sender, update_fields, created, instance, **kwargs):
if created:
    # Create your user data
    pass

这些是我的模型:

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver

class UserProfile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  age = models.IntegerField(default=18)
  description = models.CharField(max_length=300)
  is_student = models.BooleanField(default=False)
  is_teacher = models.BooleanField(default=False)

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

【问题讨论】:

  • 你是如何创建你的“普通用户”的?
  • 通过 createsuperuser 或通过 django admin
  • 我不确定你是否已经这样做了,这是否能解决你的问题,但你应该把它放到你的settings.pyAUTH_USER_MODEL = 'yourapp.UserProfile' 另外,而不是使用FK 我会将用户模型扩展到您的模型并添加您需要的字段。
  • @HigorRossato 不,这不是自定义用户模型,而是个人资料数据的相关模型。

标签: django django-models django-rest-framework django-authentication django-custom-user


【解决方案1】:

所以你快到了!

信号是在发生某些事情后执行的函数,如果用户模型被保存到数据库中,它会依次调用每个用@receiver 修饰的函数,并将该模型作为它可以找到的发送者。

您需要做的是检查它是新用户还是更新用户,如果是新用户,您需要创建用户配置文件。比如:

@receiver(post_save, sender=User)
def create_user_data(sender, update_fields, created, instance, **kwargs):
    if created:
        user  = instance
        profile = UserProfile.objects.create(user=user, age=12)

现在,这只有在用户本身包含足够的信息来创建配置文件时才有效!

【讨论】:

猜你喜欢
  • 2021-12-13
  • 2019-01-12
  • 2017-12-21
  • 2018-06-11
  • 2013-12-23
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多