如何在 django 3 中正确发出信号?
How can I correctly make signals in 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, instance, **kwargs):
instance.profile.save()
这是我的 users/apps.py:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
一切正常,没有异常,错误。但它不会为新用户创建配置文件。
注意:
- 我在
ready
方法中写了print()
。但是它不打印。
- 当我在管理站点中创建个人资料时,没有问题。但是为什么信号不起作用?
首先,如果您更改了用户模型或尝试使用其他模型作为用户模型,请不要忘记将行 AUTH_USER_MODEL = 'users.User'
添加到您的 settings.py
(更改 'users.User' 到用户应用程序的路径)以告诉 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)
最后,如果您已完成这些步骤,但信号仍然无效,请尝试在 users
应用程序的 __init__.py
中添加以下行:
default_app_config = 'users.apps.UsersConfig'
我有在 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, instance, **kwargs):
instance.profile.save()
这是我的 users/apps.py:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
一切正常,没有异常,错误。但它不会为新用户创建配置文件。 注意:
- 我在
ready
方法中写了print()
。但是它不打印。 - 当我在管理站点中创建个人资料时,没有问题。但是为什么信号不起作用?
首先,如果您更改了用户模型或尝试使用其他模型作为用户模型,请不要忘记将行 AUTH_USER_MODEL = 'users.User'
添加到您的 settings.py
(更改 'users.User' 到用户应用程序的路径)以告诉 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)
最后,如果您已完成这些步骤,但信号仍然无效,请尝试在 users
应用程序的 __init__.py
中添加以下行:
default_app_config = 'users.apps.UsersConfig'