Django URL-адрес переменной число параметров - PullRequest
1 голос
/ 03 апреля 2011

Мне было интересно, есть ли в Django способ иметь URL-адреса, которые допускают несколько аргументов после /, их переменное количество.

Вот пример того, что я имею в виду:

Так что если у меня есть страница о нас с URL-адресом / page / about_us, то у меня есть ссылка на страницу о нас, которая называется контактной информацией, будет ли это / page / about_us / contact_info, на которой может быть другая страница и и так далее.

Как бы вы написали обработку URL, чтобы разрешить / page, за которой следует любое количество других страниц с косой чертой? Кажется, что это было бы полезно для таких вещей, как хлебные крошки, а также сделало бы URL очень читабельными. Я просто не знаю, как бы я сделал регулярное выражение или представление, которое может принимать страницы с переменным числом в пути в качестве аргументов.

Было бы лучше просто использовать регулярное выражение, которое фиксирует все после / page / в качестве одного длинного параметра, а затем разбить представление на разделение на /? Как будет выглядеть такое регулярное выражение? Я не могу включить / в регулярное выражение без проблем.

1 Ответ

3 голосов
/ 03 апреля 2011

Один из способов сделать это с помощью вашего urls.py - завершить свое регулярное выражение с помощью $ или посмотреть порядок добавления ваших URL.

Например:

url(r'^page/about_us/$', 'example.views.about_us', name='about_us'),
url(r'^page/about_us/contact_info/$', 'example.views.contact_info', name='contact_info'),
url(r'^page/about_us/contact_info/map/$', 'example.views.map', name='map'),

будет работать правильно.Так будет:

url(r'^page/about_us/contact_info/map/', 'example.views.map', name='map'),
url(r'^page/about_us/contact_info/', 'example.views.contact_info', name='contact_info'),
url(r'^page/about_us/', 'example.views.about_us', name='about_us'),

Но это не позволит вам перейти на страницы, отличные от вашей страницы about_us:

url(r'^page/about_us/', 'example.views.about_us', name='about_us'),
url(r'^page/about_us/contact_info/', 'example.views.contact_info', name='contact_info'),
url(r'^page/about_us/contact_info/map/', 'example.views.map', name='map'),

В последнем примере, если ваш сайт расположен по адресу www.example.comи вы пошли на www.example.com/page/about_us/ вы бы достигли представления about_us.Однако, если вы перейдете на www.example.com/page/about_us/contact_us/, вы все равно получите представление about_us.Это потому, что если ваше регулярное выражение не заканчивается на $, оно будет соответствовать всему, что начинается с вашего выражения, и перенаправит вас.

URL-адреса проверяются по порядку, поэтому, если вы не укажете $ и порядок URL-адресов будет добавлен соответствующим образом, вы все равно достигнете правильных страниц, как во втором блоке URL-адресов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...