在Django模型上设置经过身份验证的用户

时间:2013-05-18 23:00:41

标签: django django-models

我有许多模型需要回顾创建/更新它们的用户。通常,这只涉及将request.user传递给相关属性,但是如果可能的话,我想让它自动化。

Doctrine(PHP ORM)的扩展名为Blameable,它会在持久化模型实例时设置对当前经过身份验证的用户的引用,例如:

class Post
{
    /**
     * Will set this to the authenticated User on the first persist($model)
     * @ORM\ManyToOne(targetEntity="User", inversedBy="posts")
     * @Gedmo\Blameable(on="create")
     */
    private $createdBy;

    /**
     * Sets this to the authenticated User on the first and subsequent persists
     * @ORM\ManyToOne(targetEntity="User")
     * @Gedmo\Blameable(on="update")
     */
    private $updatedBy;
}

为了在Django中获得相同的功能,我首先想到的是尝试使用pre_save信号挂钩来模拟它 - 但是我需要在视图函数之外访问请求(looks possible with some middleware但有点hacky)。

Django有类似的功能吗?我最好明确地传递经过身份验证的用户吗?

2 个答案:

答案 0 :(得分:0)

Django的解耦程度使得无法在模型实例中自动设置用户。

答案 1 :(得分:0)

中间件解决方案是可行的方法。当我需要这样做时,我只需添加到save()方法,如下所示:

class MyObject(models.Model):
  def save(self, *args, **kwargs):
    if not self.created_by:
      self.created_by = get_requests().user

    super(MyObject, self).save(*args, **kwargs)

至于将请求存储在全球字典中的“hackyness”,我想你会克服它。有人曾经说过这种模式,“这是最糟糕的,除了所有其他人”。

P.S。如果你想在你的代码深处使用django.contrib.messages,你会发现它真的很有用。