0

我正在尝试在我的一个视图中设置过滤器查询......基本上我的代码如下所示:

def inventory(request):   
   vehicle = Vehicle.objects.all().exclude(status__status='Incoming').order_by('common_vehicle__series__model__manufacturer__manufacturer', 'common_vehicle__series__model__model', 'common_vehicle__year')

   year_count = Vehicle.objects.exclude(status__status='Incoming').order_by('-common_vehicle__year__year').values('common_vehicle__year__year').annotate(count=Count('id'))
   make_count = Vehicle.objects.exclude(status__status='Incoming').order_by('common_vehicle__series__model__manufacturer__manufacturer').values('common_vehicle__series__model__manufacturer__manufacturer').annotate(count=Count('id'))

   return render_to_response('vehicles.html', {'vehicle': vehicle, 'make_count': make_count, 'year_count': year_count,})

def year_filter(request, year):
   vehicle = Vehicle.objects.filter(common_vehicle__year__year=year)

   return render_to_response('filter.html', {'vehicle':vehicle,})

def make_filter(request, make):
   vehicle = Vehicle.objects.filter(common_vehicle__series__model__manufacturer__manufacturer=make).exclude(status__status='Incoming')

   return render_to_response('filter.html', {'vehicle':vehicle,})

到目前为止,当我尝试最后两个视图中的任何一个时,我只从第一个视图(即库存)中获取查询集。URLConf 文件如下所示:

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'),
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'),
4

4 回答 4

1

在我看来,您缺少一个表达式。

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'),
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'),

<year>匹配一系列 4 位数字,<make>匹配什么?

(r'^inventory/make/(?P<make>[-\w]+)/', 'app.vehicles.views.make_filter'),

这与 make 变量匹配。很高兴知道我是否错了!

于 2009-11-12T14:45:01.393 回答
0

d{4} 总是完全匹配四个 d, dddd. 那是你要的吗?

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'),

我怀疑你需要逃避d\比较:

(r'^inventory/year/(?P<year>\d{4})/?$', 'app.vehicles.views.year_filter'),
于 2009-11-12T14:56:56.627 回答
0

看起来在您的 URLConf 中,在您已经提到的那些之上,您可能有一个覆盖下面的映射 - 比如说 -

(r'^inventory/', 'app.vehicles.views.inventory'),

这导致库存中的所有调用都命中方法库存。

这是因为 Django 以串行方式遍历它。任何首先匹配它的 URL 都会命中它。为了克服这个问题,您可以通过以下方式重新排序 url -

(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'),
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'),
(r'^inventory/', 'app.vehicles.views.inventory'),
于 2009-11-12T08:42:40.193 回答
0

古兰经是在正确的道路上。尝试在您的 URLconf 中使用它:

(r'^inventory/$', 'app.vehicles.views.inventory'),
(r'^inventory/year/(?P<year>d{4})/?$', 'app.vehicles.views.year_filter'),
(r'^inventory/make/(?P<make>)/', 'app.vehicles.views.make_filter'),

正则表达式 r'^inventory/$' 严格匹配,不超过 '/'。这应该会导致其他 URL 映射到正确的视图。

于 2009-11-12T09:45:33.790 回答