0

它在文档中写道:

自定义用户模型的另一个限制是您不能使用 django.contrib.auth.get_user_model() 作为信号处理程序的发送者或目标。相反,您必须使用生成的 User 模型注册处理程序。有关注册发送信号的更多信息,请参阅信号。

我想这意味着您可以执行以下操作:

from django.contrib.auth import get_user_model

User = get_user_model()

@receiver(post_save, sender=User)
def user_saved(sender=None, instance=None, **kwargs):
    # something

不是吗?我只是想知道我是否理解得很好(我不明白他们为什么说这是一个“限制”,但无论如何,只是想检查一下)。

4

3 回答 3

6

这是因为在创建信号时对象尚未“安装”,因此 get_user_model() 无法找到它需要附加信号处理程序的对象。

有关如何找到它以及问题所在的详细信息,请参阅此错误。

你的例子不起作用,因为get_user_model()这个原因调用会失败。目前,使信号处理程序与自定义 User 类一起工作的唯一方法是直接命名它而不使用get_user_model(),例如

@receiver(post_save, sender=myapp.MyUserModel) # can't use get_user_model() here
def user_saved(sender=None, instance=None, **kwargs):
    # something

你的编码风格也可以做一些工作:当你运行时User = get_user_model(),它会创建一个名为的变量User,其值设置为get_user_model()函数调用的结果。Python 约定(以及大多数其他语言的约定)是普通变量以小写字母开头,类以大写字母开头。

因此user = get_user_model(),稍后使用该user变量对于阅读您的代码的任何人都会更有意义,并且有助于避免将来出现混淆。

于 2013-05-14T11:00:47.897 回答
3

那应该行得通。我认为他们的意思是使用与发件人相同的功能

在文档中:

作为信号处理程序的发送者目标。相反,您必须使用生成的 User 模型注册 处理程序

于 2013-04-26T01:42:43.227 回答
1

您可以简单地将设置AUTH_USER_MODEL或任何模型用作字符串,例如'users.MyCustomUser'

def user_post_save_handler(**kwargs):
    # do something
post_save.connect(user_post_save_handler, sender=settings.AUTH_USER_MODEL)
于 2015-07-06T08:53:03.537 回答