2012-02-04 56 views
3

我有一個Django表單,它向我的視圖提交了一個值列表。我首先嚐試使用獲取方法檢索列表,但發現它只返回最後一個,我應該使用getlist。經過一番我跌跌撞撞周圍發現了一個closed Django bug是解釋這種行爲的動機:Django HTTP請求獲取與獲取列表行爲

這背後的原因是,一個API方法應該始終返回字符串或列表,但不可能兼顧。 Web應用程序中的常見情況是將表單鍵與單個值相關聯,所以這是[]語法的作用。當您打算多次使用某個鍵作爲單個值時,getlist()會用於您的場合(如您的場合)。

我只是想知道這是否實際上是一個最好的做法 - 這違背了get方法與其他的數據結構,即道路。字典。

+0

對我來說這是一個拙劣的東西 – Goin 2012-02-04 20:23:49

回答

7

HTTP請求確實支持分配給一個參數(鍵)的多個值。這就是爲什麼人們可以使用它們並且(有時)使用它們。這也是爲什麼Django引入了MultiValueDict結構。

劃分爲get()getlist()是有益的,因爲它可以幫助您避免錯誤並保持您的視圖代碼簡單。考慮其他行爲,他們都需要更多的代碼做同樣的事情:

  • get()總是返回列表。

    在大多數情況下,您只需將一個值傳遞給一個密鑰,因此您需要添加[0]並提供默認值作爲列表。

    param = request.GET.get('param', ['default value',])[0]

  • get()返回單個數值或者列表,取決於值的數量。

這是HTML選擇中的一個缺點,允許多個選項。人們可以選擇零個,一個或多個值。這意味着你將需要自己轉換單個值列表或相反的方向:

params = request.GET.get('params', []) 
# Here you have absolutely no idea if this is a list or a single value 
# But you will need only one of that types 

# If you need list: --------------------------------- 
if not isinstance(params, list): 
    params = [params,] 

objs = TestModel.objects.filter(id__in=params).all() 

# If you need single value: ------------------------- 
if isinstance(params, list): 
    params = params[0] # Error if params is empty list... 


obj = TestModel.objects.get(id=params) 
  • get()總是返回一個值。那麼在這種情況下,如何在不使用getlist的情況下處理多個值?

所以要回答你的問題有一個get/getlist行爲的增值。

+0

感謝您的概述和我得到的動機,但它仍然是我很奇怪,可能因爲我不習慣這種方法。我最終會將代碼轉換爲相關類型,而不是依賴於方法,但我可以明白爲什麼您希望方法一致。 – 2012-03-02 13:34:41