【问题标题】:Django app post_save with sender=get_user_model()带有 sender=get_user_model() 的 Django 应用 post_save
【发布时间】: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

标签: django signals


【解决方案1】:

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

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

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_modelfunction 替换为字符串或设置:

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

【讨论】:

  • 我是 django 新手。这拯救了我的一天。目前我正在使用sender='auth.User' 。我想要实现的一件事是拥有一个动态用户模型,您可以根据正在查询的 api 满足 email loginusername login 的需求。不确定这是否可能。那么将发件人设置为字符串可能会有问题。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2017-10-10
  • 2013-07-14
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多