У меня есть модель Django с большим количеством полей и 20000+ строк таблицы. Для облегчения восприятия человеком URL-адресов и возможности разбивать большой список на произвольные подсписки, я хотел бы иметь URL-адрес, который выглядит так:
/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....
где «имя» соответствует атрибуту модели, а «значение» - критерий поиска для этого атрибута. Каждое «имя» будет обрабатываться как категория, чтобы возвращать подмножества экземпляров модели, где категории совпадают.
Теперь это можно обрабатывать с помощью параметров GET, но я предпочитаю более удобочитаемые URL-адреса как для пользователя, так и для поисковых систем. Эти подмножества URL-адресов будут встроены на каждую страницу, на которой отображается эта модель, поэтому кажется, что стоит создать красивые URL-адреса.
В идеале каждая пара имя / значение будет передаваться в функцию представления в виде параметра с именем name1
, name2
и т. Д. Однако я не верю, что можно определить именованные шаблоны с помощью сопоставленного текста регулярного выражения. Я не прав там?
Итак, похоже, мне нужно сделать что-то вроде этого:
urlpatterns = patterns('',
url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"),
)
Кажется, это должно соответствовать любым наборам двух пар имя / значение. Несмотря на то, что он успешно совпадает, он передает только пару фамилия / значение в качестве параметров функции представления. Я предполагаю, что каждый матч переписывает предыдущий. Предполагая, что содержащее (?: ...) + вызывает его, я вместо этого попробовал простой повторяющийся шаблон:
urlpatterns = patterns('',
url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"),
)
... и получил ту же проблему, но на этот раз *args
включает только последний сопоставленный шаблон.
Это ограничение для диспетчера URL Django и / или поддержки регулярных выражений в Python? Кажется, любой из этих методов должен работать. Есть ли способ достичь этого без жесткого кодирования каждого возможного атрибута модели в URL-адресе в качестве необязательного (. *) Шаблона?