Проблема фильтрации Джанго - PullRequest
0 голосов
/ 12 ноября 2009

Я пытаюсь настроить запрос фильтра в одном из моих представлений ... в основном мой код выглядит следующим образом:

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 ]

1 голос
/ 12 ноября 2009

Мне кажется, что вам не хватает выражения.

(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. Рад знать, если я ошибаюсь!

0 голосов
/ 12 ноября 2009

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'),
0 голосов
/ 12 ноября 2009

Коран на правильном пути. Попробуйте добавить это в свой 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-адреса будут сопоставлены с правильными представлениями.

0 голосов
/ 12 ноября 2009

Похоже, что в вашем URLConf выше тех, что вы уже упомянули, у вас может быть отображение, которое переопределяет приведенные ниже - скажи как -

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

, из-за которого все вызовы в инвентаре попадают в инвентарь метода.

Это потому, что Джанго проходит через это последовательно. Любой 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'),
...