【问题标题】:identical views different URLs相同的视图不同的 URL
【发布时间】:2011-11-19 08:11:57
【问题描述】:

我有以下路线:

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:Reverse for 'main.views.main.programs' 带有参数 '()' 和关键字参数 '{'period': u'future'}' 未找到。

如何显示/future/programs/的链接?

【问题讨论】:

  • main.views.main.candidates 是错字吗?要链接到/future/programs/,您应该调用{% url main.views.programs period='future' %}
  • @pastylegs 是的,这是一个错字。已更正。

标签: django django-templates django-views


【解决方案1】:

我想你可能想用一个单一的 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 的 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

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

【讨论】:

  • 谢谢,它的作品。在我的应用程序中,我有pastfuturepresent,但present 它是索引页的别名。例如 URL /present/programs/ 等于 /programs/,如果使用这个 rout url(r'^(?P&lt;period&gt;(|future|past|present))/programs/$' 我对 /programs/ 链接有问题,因为 rout 只匹配 //programs/
【解决方案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 %}

我认为这个解决方案更好,因为如果您对该视图只有两个选项,您可以忘记传递参数和验证它们。

现在,如果这两个选项(未来、过去)可以发展成更多选项,那么另一种解决方案会更好,但我认为情况并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 2014-08-08
    相关资源
    最近更新 更多