Dav*_* D. 14 python django django-signals
我无法理解为什么我的m2m_changed信号没有被触发.
这是代码:
models.py
class Badge(TimeStampable, Expirable, Deactivable,
SafeDeleteModel):
_safedelete_policy = HARD_DELETE
owner = models.ForeignKey(settings.AUTH_USER_MODEL,
blank=True, null=True,
on_delete=models.PROTECT)
restaurants = models.ManyToManyField(Restaurant)
identifier = models.CharField(max_length=2048)
objects = SafeDeleteManager.from_queryset(BadgeQuerySet)()
Run Code Online (Sandbox Code Playgroud)
signals.py
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from .models import Badge
@receiver(m2m_changed, sender=Badge.restaurants.through)
def my_callback(sender, **kwargs):
print("M2M has been changed!")
Run Code Online (Sandbox Code Playgroud)
apps.py(这篇帖子建议改变这个文件)
from django.apps import AppConfig
class BadgesConfig(AppConfig):
name = 'badges'
def ready(self):
import badges.signals
Run Code Online (Sandbox Code Playgroud)
去shell时:
m2m_changed.receivers
返回一个空列表(它不起作用,永远不会收到信号)我找到了类似的帖子,但没有找到答案.
为什么m2m_changed信号不起作用?
编辑
打开shell并导入时badges.signals
,它可以正常工作.这意味着问题在于apps.py:
In [1]: from django.db.models.signals import m2m_changed
In [2]: m2m_changed.receivers
Out[2]: []
In [3]: import badges.signals
In [4]: m2m_changed.receivers
Out[4]:
[((4551224720, 4520068792),
<weakref at 0x10f4da5e8; to 'function' at 0x10f462d90 (check_uniqueness)>)]
Run Code Online (Sandbox Code Playgroud)
我在Django的这一部分找到了我的错误文档.从开始,我的应用程序配置从未被调用!
实际上,要正确注册应用程序,我有两种方法:
方法1
INSTALLED_APPS = ['badges', ...]
并声明__init__.py
: default_app_config = 'badges.apps.BadgesConfig'
方法2
INSTALLED_APPS = ['badges.apps.BadgesConfig']
我的错
我正在使用INSTALLED_APPS = ['badges', ...]
没有声明任何内容__init__.py
我想Django可能会在注意到apps.py
文件夹应用程序但从未使用时显示警告.
归档时间: |
|
查看次数: |
705 次 |
最近记录: |