【问题标题】:Django 1.5 custom user model - signals limitationDjango 1.5 自定义用户模型 - 信号限制
【发布时间】:2013-04-20 01:10:31
【问题描述】:

上面写着in the doc

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

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

【问题讨论】:

    标签: python django django-users django-1.5


    【解决方案1】:

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

    请参阅this bug,了解有关如何找到它以及问题所在的详细信息。

    您的示例不起作用,因为 get_user_model() 调用会因此而失败。目前,使信号处理程序与自定义用户类一起工作的唯一方法是直接命名它而不使用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 变量对于阅读您的代码的任何人来说都更有意义,并且有助于避免将来出现混淆。

    【讨论】:

    • 不确定小写字母是什么意思,在这种情况下,用户是可调用的,或者是一个类,但是你称之为。另外,在与 AUTH_USER_MODEL 相同的 models.py 中使用 get_user_model 时,您的观点是正确的。这是一个很好的观点,但你的信息不清楚
    【解决方案2】:

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

    在文档中:

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

    【讨论】:

      【解决方案3】:

      您可以简单地使用设置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)
      

      【讨论】:

      • 您的方法在创建配置文件时出错 AttributeError: 'str' object has no attribute 'objects'
      • @Lord-shiV 似乎您在代码中正在执行类似'foo'.objects.whatever() 的操作。请检查您的处理程序函数中的代码。
      猜你喜欢
      • 2013-03-21
      • 1970-01-01
      • 2014-04-05
      • 2013-09-30
      • 2013-02-24
      • 2013-06-01
      • 2013-02-13
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多