Django 1.5自定义用户模型 - 信号限制

时间:2013-04-25 23:58:52

标签: python django django-users django-1.5

写成in the doc

  

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

我想这意味着你可以做到以下几点:

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

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

3 个答案:

答案 0 :(得分:6)

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

有关如何找到问题以及问题的详细信息,请参阅this bug

您的示例无效,因为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变量对于阅读代码的人来说会更有意义,并有助于避免将来出现混淆。

答案 1 :(得分:3)

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

在doc:

  

作为信号处理程序的发件人目标。相反,您必须注册   处理程序与生成的用户模型

答案 2 :(得分:0)

您只需将设置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)