写的是在文档中 https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-signals that:
自定义用户模型的另一个限制是您不能使用 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
不是吗?我只是想知道我是否理解得很好(我不明白为什么他们说这是一个“限制”,但无论如何,只是想检查一下)。
这是因为在创建信号时该对象尚未“安装”,因此 get_user_model() 无法找到附加信号处理程序所需的对象。
See this bug https://code.djangoproject.com/ticket/19218了解如何发现该问题以及问题所在的详细信息。
你的例子不起作用,因为get_user_model()
由于这个原因,调用会失败。目前,使信号处理程序与自定义 User 类一起使用的唯一方法是直接命名它,而不使用get_user_model()
, eg
@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 约定(以及大多数其他语言的约定)是普通变量以小写字母开头,类以大写字母开头。
So user = get_user_model()
然后使用user
稍后的变量对于任何阅读你的代码的人来说都会更有意义,并且有助于避免将来的混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)