我有一个名为“用户个人资料”的模型,它是一个自定义用户,它将用户带到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
答案 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)
现在,这仅在用户本身包含足够的信息来创建配置文件的情况下有效!