我正在尝试构建一个小wiki,但我在为它们编写正则表达式规则时遇到了问题。
我要做的是每个页面都应该有一个自己的编辑页面,当我在编辑页面上按提交时,它应该将我重定向到维基页面。
我想在我的应用程序中使用以下URL:
http://example.com/<page_name>
http://example.com/_edit/<page_name>
我的URLConf有以下规则:
url(r'(_edit/?P<page_name>(?:[a-zA-Z0-9_-]+/?)*)', views.edit),
url(r'(?P<page_name>(^(?:_edit?)?:[a-zA-Z0-9_-]+/?)*)', views.page),
但他们因某种原因无法工作。
我该如何做到这一点?
似乎一个 - 或两个 - 匹配相同的东西。
答案 0 :(得分:3)
按照更简洁的方法,我真的将编辑网址定义为:
http://example.com/<pagename>/edit
在我的拙见中,这是更清晰和可猜测的。
然后,请记住Django以您定义它们的顺序循环您的url模式,并在匹配传入请求的第一个上停止。所以他们定义的顺序非常重要。
回答你的问题:
^(?P<page_name>[\w]+)$
匹配对任何/ PageName
请始终记住起始插入符号和最终的美元符号,即我们希望URL在我们的正则表达式之前和之后分别开始和停止,否则任何前导或尾随符号/字符也会使正则表达式匹配(虽然你可能想在这种情况下出现404。)
^_edit/(?P<page_name>[\w]+)$
与编辑网址(或^(?P<page_name>[\w]+)/edit$
匹配,如果您喜欢用户友好的网址,通常称为REST网址,而RESTfullnes是一个与网址格式无关的概念)。
总结将以下内容放入您的网址:
url(r'^(?P<page_name>[\w]+)$', views.page)
url(r'^_edit/(?P<page_name>[\w]+)$', views.edit)
您可以使用自己定义的集合更改\w
,轻松强制网址不具有某些特定字符。
要了解有关Django URL Dispatching read here的更多信息。
注意:Regexp和危险一样强大,特别是在进入网络时。保持简单,并确保真正理解您的定义,否则您的Web应用程序可能会遇到一些安全问题。
有些人在面对问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。 - 杰米·扎温斯基
答案 1 :(得分:0)
请尝试以下更简单的网址:
url(r'_edit/(?P<page_name>[\w-]+), views.edit)'
url(r'(?P<page_name>[\w-]+), views.page),