2009-09-13 51 views
5

每當我打開一個頁面,我想獲得當前活動的項目ID。這將通過撬動子域來完成,並驗證當前登錄的用戶可以查看它。Django變量的選項廣泛可用

一旦我達到我的看法我希望能夠做

tasks = Task.objects.filter(project = current_project) 

凡current_project(或CURRENT_PROJECT或current_project ???)已設置了。

任何人都可以解釋我在文檔中找到的各種方法的優缺點,並將我放在正確的軌道上嗎?

  1. 會議
  2. 中間件
  3. 線程
  4. 內建

這是我到底是怎麼做的:

裝飾:

def check4project(fn): 

    current_project = 'fred' 
    def check(*args, **kw): 
     kw['project']=current_project 
     return fn(*args, **kw) 
    return check 

查看示例

@login_required 
@check4project 
@tweetpost 
def index(request, project=0): 

    print project 

回答

4

這一切都取決於你的「當前項目」的語義是什麼。這裏有一些可能性:

  1. 這可能是該用戶的特徵:他訪問他的個人資料頁面,並設置當前項目。這將存儲在數據庫中,您可以使用ORM訪問它。

  2. 它可能是URL的一個特徵,完全基於子域。這可以通過訪問請求的中間件來完成,例如,可以解析主機名並在請求中設置一個可以在視圖函數中訪問的自定義屬性。

  3. 與#2類似,如果檢查項目是爲某些視圖完成的,但不是全部完成,則可以使用視圖裝飾器。這與Django的裝飾器類似,用於檢查授權。

  4. 這可能是用戶訪問該網站的一個特徵:他訪問一個項目頁面,選擇一個項目進行工作,直到他選擇另一個項目爲止。這將最好存儲在會話中,專門用於這種瞬態存儲。

從你的描述,它sounsd喜歡#2或#3是最適合你,取決於你的觀點關心子項目,而不是如何之間瓜分。

+0

感謝您的幫助,它幫助我澄清了各種選項。 我喜歡3的聲音,因爲這是驗證用戶是否可以同時訪問項目的一種簡單方法,但大多數情況下並不是所有視圖都需要了解項目。 – PhoebeB 2009-09-13 13:14:42

+0

對於視圖裝飾者+1。 – 2009-09-13 17:44:59

0

你有沒有考慮一個custom template tag

+0

大多數情況下,我希望在調用模板之前在視圖中,但感謝貢獻。 – PhoebeB 2009-09-13 12:35:31

1

你可以創建一個context_processor,然後從request對象中獲取你的值。

+0

context_processor不是這個問題的最佳解決方案,但它解決了我遇到的另一個問題!謝謝。 – PhoebeB 2009-09-13 13:15:16