请问在Django中,如何能够访问一个视图,该视图将根据GET请求中的填充键进行过滤
我只使用一个搜索视图,但使用两种形式:
我接受这些要求:
q = request.GET.get('q') # this is for VIN and LOT number (two columns in Model/DB)
make = request.GET.get('make')
model = request.GET.get('model')
year_from = request.GET.get('year_from')
year_to = request.GET.get('year_from')
没有必需的字段/请求,因此它应该动态工作。如果用户填写“q”-它将按VIN或批号过滤掉。 如果用户将填写品牌和年份,它将按品牌和年份过滤掉
如果,elif,elif,elif,…有什么合适的方法吗
这是我的解决方案,但我真的不喜欢它,它不专业,我不知道如何找到更好的解决方案
def is_valid_queryparam(param):
return param != '' and param is not None
def search_filer(request):
qs = Vehicle.objects.all()
# VIN and Lot number
q = request.GET.get('q')
make = request.GET.get('make')
model = request.GET.get('model')
year_from = request.GET.get('year_from')
year_to = request.GET.get('year_from')
if is_valid_queryparam(q):
qs = qs.filter(Q(vin__icontains=q) | Q(lot_number__icontains=q))
elif is_valid_queryparam(make):
qs = qs.filter(make__name__exact=make)
elif is_valid_queryparam(model):
qs = qs.filter(model__name__exact=model)
elif is_valid_queryparam(year_from):
qs = qs.filter(year__gte=year_from)
elif is_valid_queryparam(year_to):
qs = qs.filter(year__lte=year_to)
elif is_valid_queryparam(make) and is_valid_queryparam(model):
qs = qs.filter(make__name__exact=make)\
.filter(model__name__exact=model)
elif is_valid_queryparam(make) and is_valid_queryparam(model) and is_valid_queryparam(year_from):
qs = qs.filter(make__name__exact=make)\
.filter(model__name__exact=model)\
.filter(year__gte=year_from)
elif is_valid_queryparam(make) and is_valid_queryparam(model)\
and is_valid_queryparam(year_from) and is_valid_queryparam(year_to):
qs = qs.filter(make__name__exact=make)\
.filter(model__name__exact=model)\
.filter(year__gte=year_from)\
.filter(year__lte=year_to)
...
...
...
return qs
def search_view(request):
qs = search_filer(request)
# Year field for search form
today = datetime.now()
context = {
'queryset': qs,
'years_from': reversed(range(1920, today.year + 1)),
'years_to': reversed(range(1920, today.year + 1))
}
return render(request, 'search.html', context)
谢谢你的建议
我也不知道为什么上下文不能重用,正如你所看到的,我创建了两个变量years\u from和years\u to,因为我在模板中循环使用它们:
<option value>From ...</option>
{% for y in years_from %}
<option value="{{ y }}">{{ y }}</option>
{% endfor %}
<option value>To ...</option>
{% for y in years_to %}
<option value="{{ y }}">{{ y }}</option>
{% endfor %}
当我尝试只创建一个一年变量并在模板中循环时,它起了作用。但是当我用相同的变量创建另一个循环时,没有显示任何值。所以我创建了完全相同的变量和循环
多谢各位
我已经想出了解决这个问题的办法。它确实不专业,但它做了理想的工作。我将很高兴得到任何建议或提示,以使我的代码更好。如果有人想尝试像我这样的东西,我的解决方案如下:
相关问题 更多 >
编程相关推荐