URL-адреса django с переменным количеством параметров

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

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

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

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

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


person Jon    schedule 03.04.2011    source источник


Ответы (1)


Один из способов сделать это с вашим 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-адресов.

person dting    schedule 03.04.2011
comment
Я также обнаружил, что могу использовать это регулярное выражение: (r'^page/(?P‹slug›.+)', 'mypageview'). Он будет соответствовать всему, что начинается с /page. Кроме того, весь фрагмент после /page передается в представление как один параметр. Затем я могу разбить его и обработать в представлении. Итак, если бы URL-адрес был /page/about_us/contact/, я бы получил /about_us/contact в качестве параметра, называемого slug в представлении. Который я затем разделил на /, чтобы улучшить обход страницы. Я думаю, что это будет работать и будет довольно гибким. - person Jon; 03.04.2011