2013-05-18 91 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,你也會發現它非常有用。

相關問題