2017-01-09 80 views
1

我正在学习从一本书Django和我钻进了先进的URL,在这里有一个正则表达式,它不是解释:这个正则表达式在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_slugpage_id?和他们之间有什么关系?

+1

在[文档(链接)](https://docs.djangoproject.com/en/1.10/topics/http/urls/#named-groups)中有很多解释。 –

回答

2

如果要移动到先进的网址,我相信你了解基本的网址标记的作品。 每当我们处理变量url模式时,都会使用正则表达式模式。在博客的情况下,URL可以理解为

  • domain.com/post-1/
  • domain.com/post-2/

  • domain.com/shortpost-1/
  • domain.com/shortpost-2/

等。

我们可以在这里看到一个常见模式,它可以作为页面段落(或前缀)和页面/帖子ID相关联。 所以我们创建了两个变量,即page_slug和page_id。 (注意:像其他地方的变量名可以重命名自己的喜好 正则表达式因此被创建为/(?P<page_slug>\w+)-(?P<page_id>\w+))/' 其中:

  • ?P<>:定义了我们定义一个变量
  • < text>文本是你的变量的名称
  • \w+:是你的正则表达式,它定义了什么样的模式是可以接受的(在第是\ w表示集合[0-9a-zA-Z_]+中的任何值表示任何重排次数。如果您想了解更多信息,请参阅https://www.ntu.edu.sg/home/ehchua/programming/howto/Regexe.html以供参考,http://regexr.com/可供参考。
  • 和之间的-仅仅是这可能被替换为必须放文说-no-看起来像domain.com/page-no-1/

标记的其余部分是类似于正常的网址,这意味着在给定模式下开始的任何url (?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.argsself.kwargs的URL参数基于类的意见,这样你就做self.kwargs['page_slug']

访问
+0

伟大的解释,理解一切,顺便说一下,在这个例子中,我必须添加page_slug和page_id到每一个功能是吗? –

+0

是的,这是正确的。 – Saket

0

此正则表达式匹配下列网址:

/abc-def/history/ (abc goes to page_slug and def to page_id) 
/ghi-jkl/edit/ 

相关问题