0

我有许多模型需要参考创建/更新它们的用户。通常,这仅涉及传递request.user给相关属性,但是如果可能的话,我希望将其设为自动。

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

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信号挂钩来模拟这一点 - 但是我需要在视图函数之外访问请求(看起来可以使用一些中间件,但有点 hacky)。

Django 是否已经有类似的东西可用?我最好明确传递经过身份验证的用户吗?

4

2 回答 2

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”,我想你会克服的。有人曾经说过这种模式,“这是最糟糕的,除了所有其他的”。

PS 如果您想在代码深处使用 django.contrib.messages,您也​​会发现它非常有用。

于 2013-05-19T01:25:07.763 回答
0

Django 的解耦级别使得在模型实例中自动设置用户成为不可能。

于 2013-05-18T23:02:56.293 回答