2013-05-18 45 views
0

我有许多模型需要引用回创建/更新它们的用户。通常这只需要将request.user传递给相关的属性,但是如果可能的话,我想尽可能自动完成。在Django模型上设置通过身份验证的用户

有用于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是否有类似的东西可用?我最好明确地传递经过身份验证的用户吗?

回答

0

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

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,你也会发现它非常有用。

相关问题