Django模型:创建普通用户时创建自定义用户模型

时间:2019-05-31 13:35:20

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

我有一个名为“用户个人资料”的模型,它是一个自定义用户,它将用户带到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

1 个答案:

答案 0 :(得分:0)

所以你快到了!

信号是在发生某种情况后执行的功能,如果将用户模型保存到数据库中,则它依次调用用@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)

现在,这仅在用户本身包含足够的信息来创建配置文件的情况下有效!