相同的视图不同的URL

Dea*_*dly 1 django django-templates django-views

我有以下路线:

url(r'^future/programs/$', main.programs, {'period': 'future'}),
url(r'^past/programs/$', main.programs, {'period': 'past'}),
Run Code Online (Sandbox Code Playgroud)

当我尝试显示模板链接,使用模板标记url这样

{% url main.views.main.programs %}
Run Code Online (Sandbox Code Playgroud)

我总是得到链接/past/programs/.当我尝试这样的时候

{% url main.views.main.programs period="future" %}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

渲染时捕获NoReverseMatch:反向'main.views.main.programs',参数'()'和关键字参数'{'period':u'future'}'未找到.

我如何显示链接/future/programs/

Tim*_*ony 5

我想你可能想用一个单独的url模式来处理它:

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

在你看来:

def programs(request, period):
    if period == 'future':
        ...
    elif period == 'past':
        ...
Run Code Online (Sandbox Code Playgroud)

并在模板中:

{% url main.views.main.programs period="future" %}
Run Code Online (Sandbox Code Playgroud)

在您的方法中,您错误地使用反向流向前流,即url conf 的额外关键字参数与传递给匹配模式的关键字参数.

前者是允许在匹配时传递给视图的额外数据(即,当用户转到/ future/programs /时,模式匹配并period=future传递给视图),后者是用于实际数据的实际数据匹配url(即period=future传递给reverse()试图匹配除了那些关键字参数的模式的函数 - 你没有概述)

编辑:

在您的网址中使用更合适的模式将是这样的:

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

选择只能是"过去"或"未来".这对于传入的URL很好,但是django的reverse()函数(在url模板标记中使用)无法处理其他选择:

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

目前的主要限制是模式不能包含使用竖线("|")字符的替代选择.