2017-08-24 64 views
0

全部,Modelchoicefield Queryset Confusion

我是新來的Django,迄今爲止一直做得不錯,但這一次讓我難住。我正在嘗試使用ModelChoiceField來處理多個具有相同名稱的記錄。我使用的是Postgresql,所以我可以確定我需要使用獨特的命令,而且這個工作正常。我的下拉列表中的記錄全部被精簡爲每個記錄的一個版本。但是,當我嘗試獲取特定記錄的所有版本時,這就是我迷失的地方。如果我不通過DetailView使用不同的分辨率,我可以獲得每條記錄的詳細信息,但我真的試圖在模型選項字段後的屏幕上獲取每條記錄的所有版本。

這裏是我的形式:

class History(forms.Form): 

     dropdown = forms.ModelChoiceField(queryset=History.objects.all()) 

     def __init__(self, user, *args, **kwargs): 
      super(History, self).__init__(*args, **kwargs) 
      self.fields['dropdown'].widget.attrs['class'] = 'choices1' 
      self.fields['dropdown'].empty_label = '' 

      qs = History.objects.all().distinct('record_name') 
      self.fields['dropdown'].queryset = qs 

我最終想獲得一個視圖在屏幕上查詢集通過我的模板。我已經嘗試了模板中的幾個不同版本的代碼,但似乎沒有任何工作。如果我不使用明確的CBV DetailView,我可以使用詳細視圖獲取所有記錄。但是,這不是我想要做的。我在模板中使用了幾個版本的queryset命令,因爲我發現了幾個與我的類似的問題,但似乎無法使其工作。我發現幾個類似的參考:

{% for record in form.history.field.queryset %} 
etc. 
{% endfor %} 

但似乎無法讓它在我的Django模板中工作。任何和所有的幫助表示讚賞!先謝謝你!

+0

,那麼它是關於顯示數據記錄取決於你的下拉框的當前值? –

+0

@Max M是的,這就是我想要做的,獲取用戶從下拉框中選擇的值,然後在下一個屏幕上顯示所有具有相同名稱的記錄。 –

回答

0

在這種情況下,我建議要麼

一)把你的下拉字段的值到你的URL匹配。 See the django docs for named groups in URL。另外,您可以將onchange事件添加到您的下拉字段中,該下拉字段重定向到<current url>/<value of dropdown>,或者只更改鏈接到下一頁的(如果存在)按鈕的值。 注意:使用此解決方案,您必須確保您的下拉字段的值匹配url-formatdjango's slugify might be useful for this)。

B)你的下拉字段添加到您的輸入形式或作爲輸入字段。然後,你可以提取你的下拉與價值:

try: 
    dropdown_value = request.POST['dropdown-field-name'] # dict-error if field is not in request.POST 
except: 
    # some error actions 

那麼你就可以作爲過濾器添加此值到您的查詢集:如果我理解正確的話您的問題

def get_queryset(self, dropdown_value=None): 
    # ... 
    qs = qs.filter('field-name' = dropdown_value) # possibly no/wrong results if dropdown_value is corrupted or manipulated 
+0

@ Max M ..感謝您的幫助。我會試試這些例子,看看會發生什麼。在回顧你的建議時,他們比我想象的要先進得多。作爲一個例子,如果下拉列表中有A,B和C ......我希望讓用戶選擇其中的一個,然後點擊提交。然後下一個屏幕將是A的所有版本的列表(假設用戶選擇了A)。我用CB列表視圖試了一下,但得到了整個列表。除了你建議的只是獲得A條目列表之外,還有其他方法嗎?或者因爲queryset而不可能? –

+0

檢查[此問題](https://stackoverflow.com/a/40543879/8389244)。它可能會給出您正在尋找的答案 - 或者您可以將其與我的建議混合使用。 –

+0

上面的建議似乎並沒有幫助。我偶然發現了ModelChoiceField的to_field_name選項,它基本上給我的下拉列表中的記錄的名稱,但我似乎無法弄清楚如何在下一個屏幕上獲取所有具有相同名稱的記錄。當我刪除不同的時候,我可以單獨獲取它們,但那不是我想要做的。我基本上只想獲得具有相同名稱的記錄「列表」,然後單擊並獲取詳細信息。我似乎能夠獲得整個列表,但不是我正在尋找的子集。任何其他想法? –