Django信号文件

83qze16e  于 2023-10-21  发布在  Go
关注(0)|答案(3)|浏览(155)

Django如何知道在哪里寻找Signal函数?比如在哪个.py文件中搜索接收器函数?它是否搜索每个文件并在找到时执行该函数?
试着阅读文档,但没有多大帮助。

sr4lhrrt

sr4lhrrt1#

Django使用信号注册来确定信号接收器函数的位置。想象一下,你想创建一个社交媒体应用程序,每个用户都有一个个人资料页面。从技术上讲,你不能允许用户手动创建个人资料页面;相反,它应该在创建用户时自动创建。假设你有一个这样的模型:

class Profile(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    profile_photo = models.ImageField()

要使用信号自动为每个用户创建配置文件页面,您需要在Django应用程序中创建一个signals.py文件,然后将其导入app.py文件。这允许您定义信号处理程序并将它们连接到用户模型的post_save信号,确保每当创建新用户时自动创建配置文件页面。

信号.py

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)

如前所述,您需要将signals.py文件导入到app.py文件中,以允许您连接到用户模型的post_save信号,确保每当创建新用户时自动创建配置文件页面。

app.py

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

Reference

uqjltbpv

uqjltbpv2#

另一个可行的选择是在signals.py文件中创建信号函数,例如:

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)

要连接接收器,请使用上面所示的Signal.connect()方法。
Reference

nxagd54h

nxagd54h3#

django如何知道在哪里寻找Signal函数?比如在哪个.py文件中搜索接收器函数?
它没有。您只需通过**@receiver装饰器[Django-doc]或直接将其与.connect(…)[Django-doc]连接来注册信号。因此,这意味着您可以将代码库中任何地方的处理程序连接到信号。
唯一的问题是,并不是代码库中的所有文件本身都被解释(直接或经过一定时间)。因此,您需要确保Django加载该文件。
这意味着你应该将这些加载到Django会自动查找的文件中,比如models.py,或者你使用应用配置的
.ready(…)**方法[Django-doc]强制加载(为该应用加载)。
因此,您可以使用以下命令加载模块:

# app_name/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    # …

    def ready(self):
        import app_name.signals  # noqa

其中signals可以是任何模块,尽管signals当然是一个常用名称。

相关问题