Я думаю, что вы можете подойти к нему с помощью одного шаблона 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
ОсновнойНа данный момент ограничением является то, что шаблон не может содержать альтернативные варианты выбора с использованием символа вертикальной черты («|»).