2012-01-10 151 views
2

在我的Django網站中,我有一個特定的參數,我想通過url或查詢字符串進行設置。例如。 mysite.com/?param=value。我希望這個值一旦被設置就被傳遞給所有的視圖 - 我可以用request.GET.get('param', 'default value')來檢查它。在Django中最簡單的方法是什麼?持久地設置url參數

爲了更清楚起見,下面是一個示例 - 在我的網站標題中,我有一個包含年份列表的下拉菜單。一旦我點擊我希望今年選擇的其中一個選項,即可轉到我網站的所有其他部分,即mysite.com/?year=1999,然後mysite.com/somethingelse/?year=1999,mysite.com/onemorething/?year=1999等等。 在此先感謝。

回答

4

一種選擇是將其存儲在request.session而不是request.GET中。它仍然被設置和訪問,就像你希望它是:

request.session["param"] = "my value" 

request.session.get('param', 'default value') 

使用會話的所有細節見here

如果您在URL中特別需要此項例外情況,則該例外是透明的,並且用戶可以更改它。

ETA:有些問題的答案:?

  1. 如果你真的想要一個年= 1999 URL設置在會話變量任何視圖,您可以創建一個自定義middleware類。中間件用作過濾器,可以在到達視圖之前更改HttpRequest,或者更改從視圖返回的HttpResponse。在這種情況下,您可以讓它檢查request.GET並在必要時設置request.session,然後再執行視圖。查看文檔並確保閱讀有關中間件的詳細信息。

  2. 讓它在URL中不是一個好主意。有辦法解決這個問題,但是他們遇到很多麻煩。

  3. 您可以使用RequestContextpass a request to a template在那裏修改。但爲什麼你會在那裏做而不是在視圖功能?

+1

+1 *絕對*使用request.session爲此。將GET參數附加到每個網址上都非常糟糕,並且很可能會使搜索引擎結果搞砸。 – 2012-01-10 15:41:43

+0

謝謝你的答案。讓我澄清幾點。 1.我必須在哪裏設置會話變量?理想情況下,它應該在點擊鏈接時設置一個「?year = 1999」部分,但這可能在我的任何觀點中,而不僅僅是一個。 2.最好是將這部分放在url中,但我可以找到解決辦法,因爲我有一個菜單,可以在標題中顯示當前年份。 3.我可以在模板中設置會話變量嗎? – exfizik 2012-01-11 04:21:53

+0

'1。'我現在的問題是哪一個更適合這種上下文處理器或中間件?我在想前者,因爲我可以在模板中設置一個可見的變量。我有一種感覺,這是一種常見的做法。 '3.'因爲我可以將它設置在其他模板擴展的基本模板中,而不是修改我擁有的每個視圖(我有一些)。 目前,我看到的方式是: '1.'創建類似於?year = 1999的鏈接 '2.''在上下文處理器或中間件中檢查'year'鍵的request.GET' '3 .'Set'request.session ['year']' '4。'傳遞這個值在模板中使用。 – exfizik 2012-01-12 03:43:30