from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Profile
User = settings.AUTH_USER_MODEL
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
from django.apps import AppConfig
class YourAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'your_app_name'
def ready(self):
from . import signals
def create_profile(sender, instance, *args, **kwargs):
if created:
Profile.objects.create(user=instance)
创建信号函数后,可以在models.py中使用它,如下所示
from django.db.models.signals import post_save
from .signals import create_profile
# your model definition
# the use of the signal
pre_save.connect(create_profile, Profile)
3条答案
按热度按时间sr4lhrrt1#
Django使用信号注册来确定信号接收器函数的位置。想象一下,你想创建一个社交媒体应用程序,每个用户都有一个个人资料页面。从技术上讲,你不能允许用户手动创建个人资料页面;相反,它应该在创建用户时自动创建。假设你有一个这样的模型:
要使用信号自动为每个用户创建配置文件页面,您需要在Django应用程序中创建一个
signals.py
文件,然后将其导入app.py
文件。这允许您定义信号处理程序并将它们连接到用户模型的post_save
信号,确保每当创建新用户时自动创建配置文件页面。信号.py
如前所述,您需要将
signals.py
文件导入到app.py
文件中,以允许您连接到用户模型的post_save
信号,确保每当创建新用户时自动创建配置文件页面。app.py
Reference
uqjltbpv2#
另一个可行的选择是在
signals.py
文件中创建信号函数,例如:创建信号函数后,可以在
models.py
中使用它,如下所示要连接接收器,请使用上面所示的
Signal.connect()
方法。Reference
nxagd54h3#
django如何知道在哪里寻找Signal函数?比如在哪个
.py
文件中搜索接收器函数?它没有。您只需通过**
@receiver
装饰器[Django-doc]或直接将其与.connect(…)
[Django-doc]连接来注册信号。因此,这意味着您可以将代码库中任何地方的处理程序连接到信号。唯一的问题是,并不是代码库中的所有文件本身都被解释(直接或经过一定时间)。因此,您需要确保Django加载该文件。
这意味着你应该将这些加载到Django会自动查找的文件中,比如
models.py
,或者你使用应用配置的.ready(…)
**方法[Django-doc]强制加载(为该应用加载)。因此,您可以使用以下命令加载模块:
其中
signals
可以是任何模块,尽管signals
当然是一个常用名称。