我有几个字段,我希望用户在我的网站上寻找餐馆时进行搜索;cuisine_style
(m2m), neighborhoods
(m2m), event_space
(m2m).
以下拉框的形式呈现给用户。此外,我还想提供一个文本字段,用户可以在其中键入任何内容,并对餐馆name
(CharField)和keywords
(CharField)进行搜索。
我可以写一个视图来显示应用其中一个过滤器的结果,但不是所有的。哦,每个下拉菜单显然都有一个空/空的默认值。
任何想法?下面是我要开始的内容:
from django.db.models import Q
if request.GET.get('q'):
search_terms = request.GET.get('q')
restaurant_list = Restaurant.objects.filter(
Q(name__icontains=search_terms) |
Q(keywords__icontains=search_terms) |
).order_by('-user__date_joined')
,但它只覆盖一个字段。那么所有的下拉菜单呢?
哦(!)我想我可以编译所有的GET参数并将它们拆分并转储到一个列表中,但并非所有值都是单个单词。
我也对Haystack开放,但我不知道。
使用post和字段模型表单,您可以准备一个Q列表(在示例中名为qs),其中包含已发布的值:
from django.db.models import Q
if request.method == 'POST':
qs = []
if form.is_valid():
cuisine_styles = form.cleaned_data['cuisine_style']
neighborhoods = form.cleaned_data['neighborhoods']
search_terms = form.cleaned_data['search_terms']
if cuisine_styles: qs.append( Q( cuisine_style__in = cuisine_styles ) )
if neighborhoods: qs.append( Q(neighborhoods__in = neighborhoods ) )
for s in search_terms.split(' '):
qs.append( Q( name__icontains=s) )
qs.append( Q( keywords__icontains=s) )
f = None
for q in qs:
if f is None: f = q
else: f |=q
restaurant_list = Restaurant.objects.filter( f ).order_by('-user__date_joined')
#show results ....
else:
#show form ....
我假设你的下拉框是ModelMultipleChoiceField