我正在开发一个django项目,并尝试以下列形式匹配网址:
/ cards / series / SERIES NAME /
我正在尝试捕获序列名称
我的基础urls.py包括:
(r'^cards/', include('cards.urls')),
然后我的cards / urls.py包含
(r'^series/(\w+)/$',
然而,正则表达式不匹配(404)。如果我像这样硬编码路径:
(r'^series/foo/$',
然后我可以将它与/ cards / series / foo /
匹配那么,有没有人知道我做错了什么,为什么我的正则表达不捕捉/卡片/系列/系列名称/?
更新:正则表达式将匹配单个单词,但不匹配多个单词。所以:
/cards/series/FOO/
匹配,但是:
/cards/series/FOO BAR/
或任何空格不匹配。
更新:在此处找到解决方案:
how to unescape special characters in django urlpatterns
是:
(r'^series/([\w ]+)/$',
答案 0 :(得分:2)
您不得在网址中包含空格。他们必须逃脱。
http://en.wikipedia.org/wiki/Query_string#URL_encoding
基本上,不要这样做。如果空格很重要,那么它们应该像/cards/series/SERIES%20NAME/
那样在您的网址中结束。这些天使用连字符被认为是更好的做法,尽管下划线也是可以的。使用大写字母是合法的,但会使某些人(像我一样)成为穷人。
至于为什么模式不起作用,Django查询模式是正则表达式:
http://en.wikipedia.org/wiki/Regular_expression
您正在捕捉模式\w+
。 \w
是Alphanumeric characters plus "_"
的替补,而随后的+
表示匹配one or more of the preceding element
。空格不是字母数字字符,所以如果你想匹配空格,你必须将它添加到你找到的集合中。括号用于表示一组可接受的字符,因此[\w ]+
表示Alphanumeric characters plus "_" plus " "
再次,不要这样做。