具有ORed捕获组的url的单个参数的Django模板url标记在反向查找时失败

时间:2014-06-20 07:32:24

标签: django django-templates

不是最好的头衔..无论如何: 我有以下URLConf条目:

url(r'^events(?:/(?:(?P<event_id>\d+)|(?P<new>new)))?/?$', EventView.as_view(), name='events')

如您所见,事件后可以不使用额外的路径组件,或者数字或单词“new”。我的问题是尝试从模板中的两个捕获组之一进行反向查找。 Django似乎没有意识到,如果模板url标签被赋予一个参数,那就没关系,因为我的正则表达式说它是一组或另一组。

例如,我想说:

/events/1

我试图这样做:

{% url 'social_network:events' event.id %}

我得到了:

Reverse for 'events' with arguments '(1,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['events(?:/(?:(?P<event_id>\\d+)|(?P<new>new)))?/?$']

我也尝试使用命名参数(event_id = 1)来让参数在字典中传递但仍然是相同的错误。请注意,如果我删除其中一个ORed捕获组,那么它可以很好地解析。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

Django无法反转带有可选捕获组的URL,因为它无法知道放在那里的内容。处理这种情况的最好方法是在urlconf中有多个条目:一个用于no-param版本,一个用于id,一个用new。

你仍然可以让他们都指向同一个视图 - 虽然我必须说,因为这三种情况的行为明显不同,如果你有三个不同的视图,你的代码可能会更清楚。