相同的视图不同的URL

时间:2011-11-19 08:11:57

标签: django django-templates django-views

我有以下路线:

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 个答案:

答案 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 %}

我认为这个解决方案更好,因为如果你只有两个选项可以让你忘记传递参数并验证它们。

现在,如果这两个选项(未来,过去)可以增长到几个,另一个解决方案会更好,但我认为情况并非如此。