Django app post_save with sender=get_user_model()

Django app post_save with sender=get_user_model(),django,signals,Django,Signals,我有一个Django应用程序,它需要在保存用户模型时接收post_save信号,而不直接知道主项目。以下是基本布局: project/ __init__.py settings.py models.py app/ __init__.py models.py signals.py 它必须与Django 1.6一起使用,因此我不能使用ready()方法。在app/\uuuuu init\uuuuu.py中,我有: # app/__init__.py

我有一个Django应用程序,它需要在保存用户模型时接收post_save信号,而不直接知道主项目。以下是基本布局:

project/
    __init__.py
    settings.py
    models.py
app/
    __init__.py
    models.py
    signals.py
它必须与Django 1.6一起使用,因此我不能使用ready()方法。在
app/\uuuuu init\uuuuu.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):
    ...
models.signals.post_save.connect(create_user_profile, sender=get_user_model())
project/settings
中安装的应用程序包括:

# project/settings.py

INSTALLED_APPS = (
    ...
    'django.contrib.auth',
    'project',
    'app',
    ...
自定义用户模型在
project/models.py
中定义。signals模块肯定加载了正确的用户模型(signals.py顶部的快速打印语句用于演示这一点)

但是,当保存用户模型的实例时,我的回调函数永远不会被调用。django调试工具栏帮助我验证接收器是否未注册。有什么好处?非常感谢您的任何想法;)

-----编辑-----

这最终是一个愚蠢的问题,所以我不会把它作为一个答案。这是一个大型项目,在其他地方有另一个同名的信号接收器。另一个是在我的之后定义的,它在接收者的注册表中覆盖了它:P


我想这是命名惯例的一个教训。。。如果要注册一个信号处理程序,请将其命名为特定的名称。特别是如果同一信号有多个处理程序。

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

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

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
通过回溯,我发现我在
models.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):
    ...
models.signals.post_save.connect(create_user_profile, sender=get_user_model())
这是我第二次遇到这个问题,所以下面可能是其他问题的解决方案。只需将
get\u user\u model
函数替换为字符串或设置:

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

你能在
已安装的应用程序中显示应用程序的顺序吗?@alecxe-我想你想知道应用程序的顺序是什么。我更新了这个问题来阐明这一点。谢谢,但是django.contrib.auth在哪里?很好-它比其他应用程序都好。看起来你正在体验。我是django的新手。这救了我一天。目前我使用的是
sender='auth.User'
。我想实现的一件事是有一个动态的用户模型,您可以基于所查询的api来满足
电子邮件登录
用户名登录
。不确定这是否可能。将发件人设置为字符串时可能会出现问题。