配置文件未通过信号注册到自动创建的用户

问题描述 投票:0回答:1

我有一个 Django 应用程序,其中名为

Employee
的以下模型扮演用户
Profile
的角色,该角色与
User
模块中的
auth
相关:

class Employee(models.Model):

    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    email = models.EmailField(unique=True)
    phone = models.IntegerField(blank=True)
    is_chef_de_project = models.BooleanField(
        default=False
    )
    is_chef_de_produit = models.BooleanField(
        default=False
    )
    is_ghr = models.BooleanField(
        default=False
    )

    account = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        null=True
    )

我想在注册

User
时自动创建
Employee
,因此我创建了以下
signals.py
文件:

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


def generate_password():
    import secrets
    import string
    alphabet = string.ascii_letters + string.digits
    return ''.join(secrets.choice(alphabet) for i in range(10))


@receiver(post_save, sender=Employee)
def create_user(sender, instance, created, **kwargs):
    breakpoint()
    if created:
        uname = instance.first_name[0].lower() + instance.last_name.lower()
        passd = generate_password()
        User.objects.create(employee=instance, username=uname, password=passd)
        print("generated credentials:" + uname + ":" + passd)


@receiver(post_save, sender=Employee)
def save_user(sender, instance, **kwargs):
    breakpoint()
    instance.account.save()

但是注册后我发现创建的

Employee
实例中的帐户属性为空:

null account

有什么提示吗?我期望创建的

User
实例能够被注册的
Employee
引用。

python django h2
1个回答
0
投票

有趣的是,User有属性

employee
,但在数据库中关系存储在Employee模型中。

您的情况:

@receiver(post_save, sender=Employee)
def create_user(sender, instance, created, **kwargs):
    if not instance.account_id:  # o2o is empty
        uname = instance.first_name[0].lower() + instance.last_name.lower()
        passd = generate_password()
        instance.account = User.objects.create(username=uname, password=passd)
        print("generated credentials:" + uname + ":" + passd)
        instance.save()  # recursive signal, but account_id should be not more empty

我认为,这里的逻辑有点混乱,因为你正在使用信号,而这本身就是不好的做法。但应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.