2015-11-30 73 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