我有以下路线:
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/
的链接?
答案 0 :(得分:5)
我想你可能想用一个网址模式来接近它:
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的the extra keyword arguments与传递给匹配模式的关键字参数。
前者是在匹配时允许传递给视图的额外数据(即当用户转到/ future / programs /时,模式匹配并且period=future
传递给视图),后者是用于匹配url的实际数据(即period=future
传递给reverse()
函数,该函数尝试匹配除了那些关键字参数之外的模式 - 你还没有概述过它们)
修改强>
在您的网址中使用的更合适的模式类似于:
url(r'^(?P(<period>past|future)/programs/$', main.views.programs),
选择只能是“过去”或“未来”。这对于传入的URL很好,但是django的reverse()
函数(在url模板标记中使用)无法处理其他选择:
https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse
目前的主要限制是模式不能包含使用竖线(“|”)字符的替代选项。
答案 1 :(得分:2)
我宁愿为每个网址分配一个名称:
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 %}
我认为这个解决方案更好,因为如果你只有两个选项可以让你忘记传递参数并验证它们。
现在,如果这两个选项(未来,过去)可以增长到几个,另一个解决方案会更好,但我认为情况并非如此。