2010-11-04 28 views
0

我試圖根據用戶是否登錄來選擇性地處理我的Django/Python應用程序中的字段。基本上,我有類似以下模型:基於Django中的用戶認證設置模型字段的值

class Resource(models.Model): 
    uploaded = models.DateTimeField() 
    name = models.CharField(max_length=200) 
    description = models.CharField(max_length=500, blank=True) 
    file = models.CharField(max_length=200) 

我想要做的是,如果用戶發生在(登錄並訪問基於此資源文件屬性設置爲一個值對某些權限後端進行測試),以及用戶未登錄時的另一個值。因此,當任何客戶端代碼嘗試訪問Resource.file時,如果用戶未登錄'http: //mysite.com/dummy_resource_for_people_without_access'。但是,如果用戶登錄並通過了一些權限測試,那麼resource.file的值實際上就是該資源的真實URL(包括訪問該資源的任何安全密鑰等)。

從我讀過的內容看來,只能通過將請求上下文從視圖函數傳遞給模型來考慮當前登錄的用戶。但是,在上面的用例中,我試圖更加緊密地控制模型中的訪問,而不需要客戶端代碼調用特殊函數。

+1

是否需要將url存儲在數據庫中,還是可以動態生成?能夠訪問模型中的用戶/請求不應該在django中用於各種設計最佳實踐;您應該始終傳遞用戶對象或重新考慮您的設計! – 2010-11-04 00:17:25

+0

必須使用文件密鑰以及其他安全數據動態生成URL。 – Faisal 2010-11-04 13:24:52

回答

0

爲了防止任何人感興趣,我通過在django中實際創建一個自定義模型字段來解決上述問題,然後可以讓用戶生成一個URI。因此,在數據庫中,我在文件列中存儲了上述資源的密鑰。不過,現在的文件欄是一些自定義字段:

class CustomFileField(models.CharField): 
    def to_python(self, value): 
     ... 
     return CustomFileResource(value) 


class CustomFileResource: 
    def __init__(self, *args, **kwargs): 
     .... 

    def uri(usr): 
     #this method then gets the uri selectively based on the user . 

上面的圖案是好的,因爲我可以包裝數據庫字段,然後創建用於獲取基於誰是試圖訪問它的URI的具體方法。

0

最好的辦法是創建一個用於訪問文件屬性的函數,並在那裏檢查。一般來說,可以將屬性變成一個隱含的描述符,但是Django的元類魔法會阻礙這一點。

然而,一般來說,Django被設計爲在視圖級別處理驗證(並且乾淨地完成)。如果您需要數據庫層身份驗證,請考慮使用其他設置,例如CouchDB。

+0

是的,我根據所有的文檔猜測,但希望有一些技巧。我最終要做的僅僅是創建一個單獨的模板標籤和視圖級函數,當我需要將我的模型中的文件密鑰轉換爲有效的,經過許可檢查的url時,我會調用它。如果能夠無縫地完成這項工作本來是很好的,但我理解在模型層中進行會話的設計缺陷。 – Faisal 2010-11-04 13:27:06

相關問題