Django app post_save with sender = get_user_model()

时间:2014-06-27 18:31:29

标签: django signals

我有一个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

我想这是命名约定的一课...如果您要注册一个信号处理程序,请将其命名为特定的。特别是如果有相同信号的多个处理程序。

1 个答案:

答案 0 :(得分:2)

我刚刚将项目从1.7更新到1.8并遇到了这个问题。

我正在替换旧的'auth.User'django.contrib.auth.models.User引用,并偶然发现了以下错误:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.

通过回溯阅读我发现我在models.py中执行了以下操作:

models.signals.post_save.connect(create_user_profile, sender=get_user_model())

这是我第二次遇到这个问题,所以以下内容可能是其他人的解决方案。只需用字符串或设置替换get_user_model函数:

models.signals.post_save.connect(create_user_profile, sender=settings.AUTH_USER_MODEL)