одинаковые просмотры разных URL - PullRequest
1 голос
/ 19 ноября 2011

У меня есть следующие маршруты:

url(r'^future/programs/$', main.programs, {'period': 'future'}),
url(r'^past/programs/$', main.programs, {'period': 'past'}),

Когда я пытаюсь отобразить ссылку в шаблоне, используя шаблон тега url вот так

{% url main.views.main.programs %}

Я всегда получаю ссылку /past/programs/,Когда я пытаюсь вот так

{% url main.views.main.programs period="future" %}

, я получаю сообщение об ошибке:

Поймано NoReverseMatch при рендеринге: в обратном направлении для main.views.main.programs с аргументами (())и ключевые аргументы '{' period ': u'future'} 'не найдены.

Как отобразить ссылку на /future/programs/?

Ответы [ 2 ]

5 голосов
/ 19 ноября 2011

Я думаю, что вы можете подойти к нему с помощью одного шаблона URL:

url(r'^(?P(<period>[\w]+)/programs/$', main.views.programs),

и, на ваш взгляд:

def programs(request, period):
    if period == 'future':
        ...
    elif period == 'past':
        ...

и в шаблонах:

{% url main.views.main.programs period="future" %}

В вашем подходе вы путаете прямой поток с обратным потоком, то есть дополнительные аргументы ключевого слова URL-адреса conf с аргументами ключевого слова, которые передаются для соответствия шаблону.

Первые - это дополнительные данные, которые вам разрешено передавать в представление, когда оно сопоставляется (т. Е. Когда пользователь переходит в /uture / Programs /, шаблон сопоставляется и period=future передается в представление)последний является фактическими данными, используемыми для сопоставления URL-адреса (т. е. period=future передается в функцию reverse(), которая пытается сопоставить шаблон, который исключает эти ключевые аргументы - которые вы не обрисовали в общих чертах)

Редактировать:

Более подходящим шаблоном для использования в вашем URL будет что-то вроде:

url(r'^(?P(<period>past|future)/programs/$', main.views.programs),

, где выбор может быть только «прошлым» или «будущим»».Это хорошо для входящих URL-адресов, но функция django reverse() (которая используется в теге шаблона URL) не может обрабатывать альтернативные варианты:

https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse

ОсновнойНа данный момент ограничением является то, что шаблон не может содержать альтернативные варианты выбора с использованием символа вертикальной черты («|»).

2 голосов
/ 20 ноября 2011

Я бы лучше назначил каждому URL имя:

url(r'^future/programs/$', main.programs,
                           {'period': 'future'},
                           name='future_programs'),
url(r'^past/programs/$', main.programs,
                         {'period': 'past'},
                         name='past_programs'),

И для отображения ссылки в вашем шаблоне:

Past programs: {% url past_programs %}
Future programs: {% url future_programs %}

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

Теперь, если эти два варианта (будущее, прошлое) могут перерасти в еще несколько, другое решение будет лучше, но я думаю, что это не так.

...