2017-01-09 88 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/ 

相關問題