我已经能够为我的应用程序实现过滤解决方案...到目前为止,我已按年份,制造和车身样式过滤车辆库存。我想做的是以这种方式过滤记录:
假设我选择了Acura in make,在结果页面中,如果我选择其中一个过滤器,即年份或体型,我只需要包含Acura和所选年份或体型的记录。
其中一个过滤器的代码如下:
def year_filter(request, year):
vehicle_query = Vehicle.objects.filter(
common_vehicle__year__year__exact=year
).exclude(status__status='Incoming')
vehicle_list = vehicle_query.order_by(
'common_vehicle__series__model__manufacturer__manufacturer',
'common_vehicle__series__model__model',
'common_vehicle__year'
)
vehicle = paginate(request, vehicle_list)
year_count = vehicle_query.order_by(
'-common_vehicle__year__year')
.values('common_vehicle__year__year')
.annotate(count=Count('id')
)
make_count = vehicle_query.order_by(
'common_vehicle__series__model__manufacturer__manufacturer')
.values('common_vehicle__series__model__manufacturer__manufacturer')
.annotate(count=Count('id')
)
style_count = vehicle_query.order_by(
'common_vehicle__body_style__style')
.values('common_vehicle__body_style__style')
.annotate(count=Count('id')
)
color_count = vehicle_query.order_by(
'exterior_colour__exterior_colour')
.values('exterior_colour__exterior_colour')
.annotate(count=Count('id')
)
return render_to_response('vehicles.html', {
'vehicle': vehicle,
'make_count': make_count,
'year_count': year_count,
'style_count': style_count,
})
答案 0 :(得分:2)
首先,一些风格建议:你要做四个单独的查询,但每个查询都以完全相同的方式开始:
Vehicle.objects.filter(
common_vehicle__series__model__manufacturer__manufacturer=make
).exclude(
status__status='Incoming'
)
为了便于阅读,请考虑将其分配给变量,例如vehicle_query
,然后您可以在每个后续查询中使用该变量:
vehicle_list = vehicle_query.order_by(
'common_vehicle__series__model__manufacturer__manufacturer',
'common_vehicle__series__model__model',
'common_vehicle__year'
)
直到最后一分钟才会对查询进行评估,因此这不会影响效率,但会更具可读性。
现在,回答你的问题:你显然需要某种方法将所选择的值从一个视图保存到下一个视图。我不太明白其他观点如何适应这一点 - 我最初的倾向是把它放在一个隐藏的领域,或者在查询字符串中。但也许将它保存在会话中是最好的主意:
if request.POST:
chosen_vehicle = request.POST['vehicle_type']
request.session['vehicle_type'] = chosen_vehicle.id
return HttpResponseRedirect('/next/view/')
并在下一个视图中:
previously_chosen = request.session['vehicle_type']
filtered = Vehicle.objects.get(id=previously_chosen)
这有用吗?