Django app post_save with sender=get_user_model()
我有一个Django应用程序,它需要在保存用户模型时接收post_save信号,而不直接知道主项目。以下是基本布局: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
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来满足电子邮件登录
和用户名登录
。不确定这是否可能。将发件人设置为字符串时可能会出现问题。