我正在从一本书中学习django而且我已经进入了高级网址,在这里有一个正则表达式没有解释:
urlpatterns = [
url(r'^(?P<page_slug>\w+)-(?P<page_id>\w+)/',
include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]
我知道这是关于删除冗余,但它是如何实际工作的?
你从哪里得到page_slug
和page_id
以及它们之间有什么关系?
答案 0 :(得分:2)
如果您要转到高级网址,我认为您了解基本网址标记的工作原理。 每当我们处理可变url模式时,就会使用正则表达式模式。如果是博客,网址可能会显示为
domain.com/post-1/
domain.com/post-2/
或
domain.com/shortpost-1/
domain.com/shortpost-2/
等等。
我们可以在这里看到一个常见的模式,它可以作为页面slug(或前缀)和page / post id相关。
所以我们创建了两个变量,即page_slug和page_id。 (注意:像其他地方一样的变量名称可以根据自己的喜好重命名。
因此正则表达式创建为/(?P<page_slug>\w+)-(?P<page_id>\w+))/'
其中:
?P<>
:定义我们正在定义变量text
强>&GT; :text是您的变量名称\w+
:是您的正则表达式,用于定义可接受的模式(在这种情况下\ w表示集合[0-9a-zA-Z_]
中的任何内容,+
代表任何数字如果你想了解更多信息,请参考https://www.ntu.edu.sg/home/ehchua/programming/howto/Regexe.html作为参考,http://regexr.com/进行练习。-
只是一个强制性文字,可以用 -no-
替换为 { {1}} 强> 标记的其余部分类似于普通网址,这意味着任何以给定模式开头的网址 domain.com/page-no-1/
后跟后缀都会被上述视图所取代。
e.g。 - (?P<page_slug>\w+)-(?P<page_id>\w+)/
- 由domain.com/post-1/history/
处理,依此类推。
现在重要的部分是这些变量名称如何影响您的视图。 如果您使用的是基于功能的视图,则您的历史记录视图将定义为:
views.history
在基于课程的视图中,您可以使用def history(request, page_slug, page_id):
#Your code using the two variables received.
#These might be values stored in db to dynamically fetch values
或self.args
访问网址参数,以便通过 self.kwargs
答案 1 :(得分:0)
此正则表达式匹配以下网址:
/abc-def/history/ (abc goes to page_slug and def to page_id)
/ghi-jkl/edit/
等