问题描述
在大多数情况下,我的搜索都按照我需要的方式进行,但是我希望能够根据用户选择的类别进行排序。
我将searchForm
细分为包含以下内容:
def no_query_found(self):
"""
Determines the behavior when no query was found.
By default,no results are returned (``EmptySearchQuerySet``).
Should you want to show all results,override this method in your
own ``SearchForm`` subclass and do ``return self.searchqueryset.all()``.
"""
return self.searchqueryset.models(Idea)
def search(self):
sqs = super(IdeaCategories,self).search()
if not self.is_valid():
return self.no_query_found()
if self.cleaned_data['category']:
sqs = sqs.filter(tags__contains=self.cleaned_data['category'])
return sqs
以下按预期工作:
/testing/search/?q=test
->所有与“测试”相关的结果
/testing/search/?category=Development&q=
->所有与“发展”相关的结果
/testing/search/?category=Development&q=book
->所有与“开发”相关且包含“书”的结果
我唯一不知道的是如何使它在2个或更多类别上正确搜索:
/testing/search/?category=Development&category=Supplemental+Material&q=
sqs = sqs.filter(tags__contains["Development","Supplemental Material"])
解决方法
好吧!所以我现在想通了。
在我的searchForm类中:
我从数据库中创建了一个选项列表,供表单使用。
choices_group = tuple(
[(choice,choice) for choice in
Category.objects.values_list('label',flat=True)])
将这些选择应用于我的表单。
sort = forms.MultipleChoiceField(choices=choices_group,widget=forms.CheckboxSelectMultiple)
创建了我的查询集。
q_sorted = self.cleaned_data['sort']
if q_sorted:
sqs = sqs.filter(tags__in=q_sorted)
最后,在我的模板中。
{{form.sort}}