2016-10-13 66 views
3

Django的url模板標籤是如何工作的?它在封面下使用了什麼魔術來「反轉」正則表達式?Django的`url`模板標記如何反轉Regex?

你給它這樣的正則表達式:

urlpatterns = [ 
    # ex: /polls/5/ 
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), 
] 

...,然後在模板中,您可以生成該模式是這樣匹配的網址:

<a href="{% url 'detail' question.id %}">{{ question.question_text }}</a> 

如何工作?通常一個正則表達式用於解析文本,而不是生成它。 re模塊中是否提供了此功能的內置工具?

我的問題不是關於如何使用Django,或者如何用正則表達式解析文本。相反,我有興趣瞭解如何在其他地方以此「字符串模板」方式使用正則表達式。

+0

http://stackoverflow.com/questions/30100870/how-djangos-url-template-tag-works是**不是**我的問題的重複,儘管它的標題。這個問題試圖讓某些東西在Django中正常工作 - 我不是。 –

+0

你到底在問什麼? urlpatterns如何工作或url模板標記如何工作​​? – Sayse

+0

'url'模板標籤如何工作。我已經很好地理解了如何通過'urlpatterns'解析和分派傳入請求。我不明白'url'模板標記能夠如何使用相同的正則表達式並使用它來生成一個url。 –

回答

3

反轉正則表達式的關鍵是normalize()函數,該函數採用正則表達式並返回可能性列表。每種可能性都是佔位符字符串的元組和參數列表。

reverse()函數首先檢查參數是否與佔位符的參數列表相匹配。如果匹配,則佔位符字符串將使用傳遞給reverse()(使用簡單的'string' % parameters)的參數進行格式化。然後該字符串與原始正則表達式匹配。這是必要的,因爲佔位符字符串的參數沒有任何限制,因此檢查原始正則表達式可確保例如一組\d+只包含數字。

如果使用傳遞的參數格式化的字符串與原始正則表達式匹配,則它是有效的url,並返回。