【问题标题】:Django: NoReverseMatch with url tag and case-insensitive urlsDjango:带有 url 标签和不区分大小写的 url 的 NoReverseMatch
【发布时间】:2013-05-22 00:20:39
【问题描述】:

TLDR; {% url %} 标签有效。 r'(?i)^...$' url 路径有效。他们不一起工作?

我想使用反向 url 解析(通过 url 模板标签),但无论出于何种原因,它似乎与不区分大小写的 url 正则表达式(即前缀为“(?i)”的正则表达式)不兼容。为了澄清这项工作:

urls.py:

...
urlpatterns = patterns('',
    url(r'^$', home, name='home'),
    ...
)
...

base_path.html

<a href="{% url home %}">Users</a>

但这会导致 NoReverseMatch 错误:

urls.py:

...
urlpatterns = patterns('',
    url(r'(?i)^$', home, name='home'),
    ...
)
...

具体来说,我得到:

NoReverseMatch at /p/blah/users/
  Reverse for 'home' with arguments '()' and keyword arguments '{}' not found.
  Request Method:   GET
  Request URL:  http://localhost:8000/p/blah/users/
  Django Version:   1.4.3
  Exception Type:   NoReverseMatch
  Exception Value:  
    Reverse for 'home' with arguments '()' and keyword arguments '{}' not found.
  Exception Location: .../local/lib/python2.7/site-packages/django/template/defaulttags.py in render, line 424
  Python Executable:    .../bin/python
  Python Version:   2.7.3

任何想法 A) 为什么会发生这种情况,和/或 B) url 模板标签或不区分大小写的 url 正则表达式的解决方法?我已经用我们的许多其他 url 路径重现了这种行为——所有这些都通过删除“(?i)”前缀来修复(尽管我们真的希望不区分大小写)。

【问题讨论】:

  • 这是哪个版本的django?
  • @melwil 1.4.3,查看错误描述中的信息:)
  • 尝试将(?i) 放在^ 之后。
  • @melwil 啊!这完美!我可以发誓那些正则表达式指令必须放在表达式的开头。如果您添加答案,我会标记它,您可以获得积分:)
  • (?i) 的含义与使用 re.IGNORECASE 编译正则表达式相同。 (?i) 使python中的整个正则表达式不区分大小写,并且可以放在正则表达式中的任何位置,甚至是中间或末尾。不过我不知道 django 的这个限制。

标签: regex django django-templates


【解决方案1】:

Django url 模式似乎需要您将 regexflags 放在 ^ 锚之后。

url(r'^(?i)$', home, name='home'),

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 2017-03-17
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多