我有一个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
我想这是命名约定的一课...如果您要注册一个信号处理程序,请将其命名为特定的。特别是如果有相同信号的多个处理程序。
答案 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)