2015-11-30 72 views
0

假設我需要過濾多選框中可用的選項。Django表單和查詢集

在我看來,我有:

class ArticleCheckbox(forms.ModelForm): 
    article= forms.ModelMultipleChoiceField(queryset=Article.objects.all(),required=False, widget=forms.CheckboxSelectMultiple) 
    class Meta: 
     model = Book 
     fields = ('m2m_article',) 

。 在我看來,我將指派:

articleform = ArticleCheckbox() 
articleform.fields["m2m_article"].queryset = Article.objects.filter(category = "Animals") 

如何在視圖中查詢集的分配影響從類查詢集(Article.object.all())? 覆蓋?我不這麼認爲。

我想覆蓋queryset。我該怎麼做?

回答

0

這是行不通的?

article=forms.ModelMultipleChoiceField(queryset=Article.objects.all().filter(category = "Animals"),required=False, widget=forms.CheckboxSelectMultiple)

直接在模型中。或者你想離開過濾到視圖做不同的事情?

+0

我需要在類構造完成後在視圖中完成它。我需要不同的過濾器。上面的靜態例子只是一個例子。我的代碼我的代碼過濾器是動態的。 – caliph

+0

我可以想象的最佳解決方案是通過表單構建的過濾標準。但即使我將一個變量傳遞給模型表單,我也無法在構建之前使用它。這意味着我不能像你的例子那樣動態設置過濾器。或者我錯了? – caliph

+0

我同意Sayse提出的關於向模型提供預先請求的方法。 –

0

你這樣做的方式是正確的,除了你指定的類,而不是ArticleCheckBox

articleform = ArticleCheckbox() 

實例當窗體初始化它被賦予一個默認查詢集並要覆蓋它,最初的一個永遠不會查詢數據庫,因爲在那個時候不需要檢索數據。

+0

注意:這個答案的條件是,你只打算從一個函數做到這一點,如果你想要這個默認行爲,那麼既可以作爲你的默認設置,也可以作爲初始化程序 – Sayse

+0

感謝提示,我糾正了錯誤我的例子。 – caliph

+0

當我做這樣的覆蓋時,HTML只反映了視圖中的過濾器。不幸的是,POST回覆(未清除)具有所有選項。沒有壓倒一切的過濾器!這是非常不幸的,因爲當應用object.save()時,所有未顯示的選項都在數據庫中被取消選擇。 – caliph