【发布时间】:2014-06-27 18:31:28
【问题描述】:
我有一个 Django 应用程序需要在保存用户模型时接收 post_save 信号,而无需直接了解主项目。这是基本布局:
project/
__init__.py
settings.py
models.py
app/
__init__.py
models.py
signals.py
它必须适用于 Django 1.6,所以我不能使用 ready() 方法。在app/__init__.py 我有:
# app/__init__.py
import signals
在app/signals.py:
# app/signals.py
from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=get_user_model())
def user_save_callback(sender, instance, **kwargs):
...
project/settings中安装的应用包括:
# project/settings.py
INSTALLED_APPS = (
...
'django.contrib.auth',
'project',
'app',
...
自定义用户模型在project/models.py 中定义。信号模块肯定加载了正确的用户模型(signals.py 顶部的快速打印语句用于演示这一点)。
但是,当保存用户模型的实例时,我的回调函数永远不会被调用。 django-debug-toolbar 帮助我验证接收器没有被注册。是什么赋予了?非常感谢您的任何想法;)
----- 编辑-----
它最终成为一个愚蠢的问题,所以我没有将它作为答案发布。这是一个大型项目,在其他地方还有另一个同名的信号接收器。另一个是在我的之后定义的,它在接收者的注册表中覆盖它:P
我想这是关于命名约定的一课……如果您要注册一个信号处理程序,请将其命名为特定的名称。尤其是当同一个信号有多个处理程序时。
【问题讨论】:
-
你能在
INSTALLED_APPS中显示应用程序的顺序吗? -
@alecxe - 我假设您想知道应用程序的顺序。我更新了问题以阐明这一点。
-
谢谢,
django.contrib.auth在哪里? -
好点 - 它高于其他应用程序。
-
看起来您正在体验this problem。