2012-08-31 59 views
3

從request.GET中排除參數的最佳方法是什麼?Django,從請求中排除參數.GET

例如,獲得一個網址PARAM ?a=a&b=b&c=c,我要拿出PARAM b鍵生成URL參數去?a=a&c=c不改變request.GET

現在我通過按鍵循環採取OUT B

params = {} 
for key,value in request.GET.items(): 
    if not key == 'b': 
    params[key] = value 

url = urllib.urlencode(params) 

我想知道是否有更好,更優雅的方式來實現相同的結果?例如。

request.GET.urlencode(exclude=['b',]) 

,甚至這一點,更好

urllib.urlencode(request.GET.exclude('b'...) 

回答

7

這應該工作:

get = request.GET.copy() 
del get['b'] 

params = urllib.urlencode(get) 
+0

不錯我想過用這種方法太,但後來我需要的是繞到與因不可控PARAMS try和catch塊。 –

+0

如果您想避免try/catch,請使用我的方法,如下所示:x = cp.pop('b',None)然後檢查:如果x不是None:... – thikonom

+0

如果您有多個獲取相同名稱的參數。例如?a = 1&a = 2&b = 3&c = 4 – dalore

2

不能直接操縱request.GET,因爲它是一個不可變QueryDict。 因此,創建一個淺拷貝,然後刪除所需的密鑰。

cp = request.GET.copy() 
cp.pop('b') 

params = urllib.urlencode(cp) 
0

所有這些問題的答案几乎得到它的權利,但未能對那裏有使用相同的密鑰名稱,它是有效的(爲什麼Django使用一個QueryDict而不是dict的全部理由)多個參數的邊緣情況。如果你使用urllib的urlencode它將失去額外的參數,你需要使用QueryDict提供的urlencode。

https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.QueryDict

的QueryDict是定製,以應對多個 值相同的密鑰字典的類。這是必要的,因爲一些HTML表格 元素,特別是<select multiple="multiple">,爲同一個鍵傳遞多個值 。

所以,正確的做法是:

querydict = request.GET.copy() 
if 'b' in querydict: 
    del querydict['b'] 
return qeurydict.urlencode()