python - 放置在models.py之外时,Django信号不起作用
问题描述
保存应用程序中的 Django 模型后,我正在尝试打印一些文本。
我在同一个应用程序的 signals.py 文件中为此创建了一个信号。
但是,它没有按预期工作(即,没有调用该函数并且没有打印文本)
但是,如果我将接收器函数放在我创建的模型下方的 models.py 文件中,它就可以正常工作(即,正在调用该函数并且已打印文本)
我浏览了文档以检查是否需要将信号放置在特定文件或位置。好像没有这样的限制。
https://docs.djangoproject.com/en/3.0/topics/signals/#django.dispatch.receiver
如果没有这样的限制,为什么会有不同的行为?
信号.py:
from django.db.models.signals import post_save
from django.dispatch import receiver
from aws_envs.models import UserStack
@receiver(post_save, sender=UserStack)
def create_user_stack(sender, **kwargs):
print("creating user stack now")
模型.py:
class UserStack(BaseModel):
name = models.CharField(max_length=50)
email = models.EmailField(unique=True, max_length=50, blank=False)
enabled = models.BooleanField(default=True)
def save(self, *args, **kwargs):
print(f"Creating stack with data: {self.name, self.email}")
super(UserStack, self).save(*args, **kwargs)
def __str__(self):
return self.name, self.email
解决方案
- 在 INSTALLED_APPS 你应该像这样注册:
'post.apps.PostConfig'
即在settings.py中替换
INSTALLED_APPS = (
'...',
'post,
)
和
INSTALLED_APPS = (
'...',
'post.apps.PostConfig',
)
- 在 apps.py 你应该添加这些:
from django.apps import AppConfig
class postConfig(AppConfig):
name = 'post'
def ready(self):
# signals are imported, so that they are defined and can be used
import post.signals
- 在应用程序的文件夹中创建了一个文件
# post/signals.py
from django.dispatch import receiver
from django.db.models.signals import post_save
from post.models import Post
def send():
print("send email!")
@receiver(post_save, sender=Post, dispatch_uid='Post_post_save')
def send_email(instance, **kwargs):
send()
推荐阅读
- amazon-web-services - PUT/POST/DELETE:403 错误禁止 + AWS SAM 的 CORS 错误
- php - 获取特定用户的主题标签帖子
- c# - 使用 Sharp7 将布尔值写入 PLC
- python - CSV 中 defaultdict / 元组的 Python 列表
- java - 即使同步块获得重复值
- antlr4 - 为基于 Antlr4 的自定义语言创建 Uber Jar
- kubernetes - 如何在 kubernetes 集群中再次添加耗尽的节点?
- drupal - 如何在区域模板中渲染或打印节点预处理
- c++ - 使用声明作为覆盖
- ios - 无法在 Swift 中调整多个设备上的布局