2016-10-13 8 views
3

Djangoのurlテンプレートタグはどのように機能しますか?正規表現を "逆"にするために、どのマジックをカバーの下で使用していますか?Djangoの `url`テンプレートタグはRegexをどのように逆転させますか?

は、あなたはそれをこのような正規表現与える:

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

を...そして、あなたのテンプレートで、あなたはこのような、そのパターンに一致するURLを生成できます。その作業を行う方法

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

?正規表現を使用してのテキストを解析すると、は生成されず、が生成されます。この機能を提供する組み込みツールがreモジュールにありますか?

私の質問は、ジャンゴを使用するか、どのように正規表現を使用してテキストを解析する方法に関するものではありません。代わりに私はこの「文字列テンプレート」の正規表現を他の場所で使う方法を学ぶことに興味があります。

+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だ、と返されました。

関連する問題