2013-04-25 69 views
0

这是写in the doc说:的Django 1.5自定义用户模型 - 信号限制

的自定义用户模型另一个限制是你不能使用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

这应该工作。 我认为他们的意思是使用相同的功能,发送者

在DOC:

发件人目标的信号处理的。相反,你必须用得到的用户模型注册 处理程序

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变量对任何读取代码的人来说都会更有意义,并且有助于避免将来出现混淆。

+0

不知道你,意味着大约小写字母是什么,用户在这种情况下可调用,或者是一类,但是你调用。此外,在使用get_user_model与AUTH_USER_MODEL **相同​​的models.py中,您的观点是正确的。这是一个很好的观点,但是你的信息并不清楚 – lajarre 2013-05-14 17:02:33

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)