写成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
不是吗?我只是想知道我是否理解得很好(我不明白为什么他们说这是一个“限制”,但无论如何,只想检查)。
答案 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)