【问题标题】:Django template url tag with single parameter for url with ORed capture group fails on reverse lookup带有 ORed 捕获组的 url 的单个参数的 Django 模板 url 标记在反向查找时失败
【发布时间】:2014-06-20 07:32:24
【问题描述】:

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

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

如您所见,在事件之后不能使用额外的路径组件,或者数字或单词“新”。我的问题是当尝试从模板中使用两个捕获组之一进行反向查找时。 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 捕获组,那么它会很好地解决。

有什么想法吗?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    Django 不能使用可选的捕获组来反转 URL,因为它不知道该放什么。处理这种情况的最佳方法是在 urlconf 中有多个条目:一个用于无参数版本,一个用于 id,一个用于 new。

    您仍然可以让它们都指向同一个视图 - 尽管我必须说,由于这三种情况的行为明显不同,如果您有三个单独的视图,您的代码可能会更清晰。

    【讨论】:

    • 知道为什么它不能进行反向查找吗?如果它从左到右,它应该匹配到第一组,它应该插入 event.id(假设前瞻/回溯或贪婪),然后匹配 $。
    • 如果我使用 3 个不同的 URL,在引用它们时如何区分它们?我是否为它们分配了不同的“名称”参数?像 url(regex1, EventView.asView(), name='events.list'), url(regex2, EventView.asView(), name='events.new') 等?
    • 实际上,它似乎确实能够处理可选组。如果我这样做:url(r'^events(?:/(?P&lt;event_id&gt;\d+))?/?$', EventView.as_view(), name='events'),它工作得很好。这是一个可选丢弃组内的命名捕获组。也许您的意思是 ORed 组?但是,对我来说还是不太有意义。
    猜你喜欢
    • 2023-03-31
    • 2015-11-17
    • 2018-12-24
    • 1970-01-01
    • 2013-08-18
    • 2020-05-02
    • 2019-12-07
    • 2017-07-28
    • 2014-12-24
    相关资源
    最近更新 更多