如何在Django 3中正确发出信号?

问题描述

我有用django3(python 3.8)编写的用户应用程序。和用于扩展用户模型的模型配置文件。因此,我想每次用户创建帐户时都这样做,django为此自动创建配置文件。我在用户应用上有Signals.py文件

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

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

这是我的users / apps.py:

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'
        
    def ready(self):
        import users.signals

所有正常工作,无异常,错误。但是它不会为新用户创建配置文件。 注意:

  1. 我用print()方法写了ready。但它不会打印。
  2. 当我在管理站点中创建个人资料时,没有问题。但是为什么信号不起作用?

解决方法

首先,如果您更改了用户模型或尝试使用其他模型作为用户模型,请不要忘记将AUTH_USER_MODEL = 'users.User'行添加到settings.py中(更改“用户”。用户”到用户应用的路径),以告知Django您正在使用其他模型而不是默认用户模型。然后在信号中而不是from django.contrib.auth.models import User尝试使用from django.contrib.auth import get_user_model并将代码更改为:

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


User = get_user_model()


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

最后,如果您已经完成了这些步骤,但仍然表示仍然无法正常运行,请尝试在__init__.py应用的users中添加以下行:

default_app_config = 'users.apps.UsersConfig'