У меня есть модель Django с большим количеством полей и 20000 + строк таблицы. Чтобы облегчить чтение человеком URL-адресов и возможность разбивать большой список на произвольные подсписок, я хотел бы иметь URL-адрес, который выглядит следующим образом:
/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....
где 'name' сопоставляется с атрибутом модели, а 'value' - критерием поиска для этого атрибута. Каждое "имя" будет рассматриваться как категория для возврата подмножеств экземпляров модели, в которых соответствуют категории.
Теперь это можно обрабатывать с помощью параметров 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 как дополнительный (. *) Шаблон?