シンプルなルーティング設定:URLパラメータnによる動的パケット取得
django.conf.urls インポートURLを から。インポートビュー urlpatterns = [ URL(R ' ^記事/ 2003 / $ ' 、views.special_case_2003)、 URL(R ' ^記事/([0-9] {4})/ $ ' 、views.year_archive) URL(R ' ^記事/([0-9] {4})/([0-9] {2})/ $ ' 、views.month_archive) URL(R ' ^記事/([0-9] {4})/([0-9] {2})/([0-9] +)/ $ ' 、views.article_detail) ]
注意:
- URLから値をキャプチャするには、あなたはそれを囲む括弧のペアを配置する必要があります。
- 各URLを持っているので、リードバックスラッシュを追加する必要はありません。例えば、それはする必要があります
^articles
代わりに^/articles
。 - 「R」の前に、各正規表現は任意ですが、追加提案しました。これは、文字列が「原始的」であることはPythonを伝えます - 文字の文字列をエスケープすべきではありません
要求のいくつかの例: /記事/ 2005/03 /要求リストは、第三のモードと一致します。Djangoは(要求、機能views.month_archiveを呼ぶだろう' 2005 '、' 03 ' )。 /記事/ 2005/3 / 第三の月のリストは、モデルが2つの数値を必要とする必要がありますので、任意のURLパターンと一致していません。 /記事/ 2003 / シーケンスにマッチしたパターンは、最初のものは最初のテストマッチとなりますので、リストモードでの最初の試合は、第二ではありません。試合の順番を検出するために、いくつかの特殊なケースの無料のインサートが好きください。 /記事/ 2003は、各パターンは、URLの末尾にバックスラッシュを必要とするため、パターンのいずれかと一致していません。 /記事/ 2003年3月3日 / 最後のパターンと一致します。Djangoは関数views.article_detail呼び出します(要求を、' 2003 '、' 03 '、' 03 ' )。
よく知られているグループ:グループの名前は、質量参加キーワードを達成するために
上記の例では、URLの値とビューに渡された位置パラメータを捕捉するために(括弧で)単純な正規表現名前グループを使用します。より高度な使い方では、ビューに渡されるURLとキーワードパラメータの値をキャプチャするために名前の正規表現のグループを使用することができます。
Pythonの正規表現では、正規表現の構文グループ名は(?P<name>pattern)
、どこname
のグループの名前で、pattern
マッチするパターンです。
ここでは上記の名前のグループのURLconf書き換えを使用しています。
django.conf.urls インポートURLを から。インポートビュー urlpatterns = [ URL(R ' ^記事/ 2003 / $ ' 、views.special_case_2003)、 URL(R ' ^記事/(?P <年> [0-9] {4})/ $ ' 、views.year_archive)、 URL(R ' ^記事/(?P <年> [0-9] {4})/(?P <月> [0-9] {2})/ $ ' 、views.month_archive)、 URL(R " ^記事/(?P <年> [0-9] {4})/(?P <月> [0-9] {2})/(?P <日> [0-9] {2})/ $ ' 、views.article_detail) ]
キャプチャされた値の代わりに関数のパラメータを表示するための位置パラメータ転送のキーとして:この実装では、唯一の微妙な違い前の例と同じです。例えば:
/記事/ 2005/03 /要求の呼び出しはviews.month_archive(リクエスト、年= ' 2005 '、=月' 03 ')関数の代わりにviews.month_archive(要求、' 2005 '、' 03 ' )。 /記事/ 2003年3月3日 / 要求(リクエスト、年=関数views.article_detailを呼び出します' 2003 '、=月' 03 '、デイ= ' 03 ')。
あなたのビュー定義関数のパラメータの順序を並べ替えることができます - 実際には、これはあなたのURLconfは、オーダーパラメータエラーの問題を起こしやすい、より明確でないことを意味します。もちろん、これらの利点は、シンプルさを犠牲にして来ます。
分布:自分のルーティングファイルを広めるために、すべてのアプリケーションのURLを入れて
アプリプロジェクトが複数ある場合、この方法は、フォルダ内のAPPアプリURLのそれぞれで、(例えば、ブログ文書インスタンス)が使用され
django.conf.urls インポート、URLが含まれます urlpatterns = [ URL(R ' ^管理/ ' 、admin.site.urls)、 URL(R ' ^ブログ/ '、(含ま' blog.urls ' ))を、 ]
逆引き参照
使用Djangoプロジェクトでは、一般的な要件は、生成されたコンテンツに埋め込まれた(とビューは、ユーザーのURLに表示される、など)や、ナビゲーション処理サーバ(リダイレクト)のためのURLの最終形態を得ることです。有効期限が切れある程度のURLにつながるしやすいので、強い願いは、URL(面倒、エラーが発生しやすいと拡張可能ではない)、または無関係な特殊なURL生成機構のURLconfを設計は、ハードコードにありません。
さまざまなレベルのために、必要なURLは、Djangoは逆引き参照URLのためのさまざまなツールを提供しています。
- テンプレートで:URLテンプレートタグを使用してください。
- Pythonのコードでは:使用して
django.core.urlresolvers.reverse()
機能を。
urls.py
django.conf.urls インポートURLを から。インポートビュー urlpatterns = [ #... URL(R ' ^記事/([0-9] {4})/ $ '、views.year_archive、名前= ' ニュース年のアーカイブ' )、 #... ]
テンプレートには:
<a href= "{% URL'news-year-archive' 2012 %}"> 2012年アーカイブする</a> <UL> {%ため yearvar で year_listの%} <LI>の<a href= "{% URL'news-year-archive' yearvar %}"> {{yearvar}}アーカイブする</a> </ LI> {% ENDFOR%} </ UL>
Pythonで:
django.core.urlresolvers インポート逆 から django.http 輸入HttpResponseRedirect デフredirect_to_year(リクエスト): 年= 2006 返す HttpResponseRedirect(リバース(' ニュース年のアーカイブ'、引数=(年、))) #の同リダイレクト( "/パス/")
注意:お使いのURLパターンに名前を付ける場合、名前は他のアプリケーションとの名前の競合を使用していないことを確認してください。あなたのURLパターンが呼び出された場合はcomment
、他のアプリケーションは、同様の名前を持っているあなたは、テンプレートにこの名前を使用する場合、URLを挿入するかを保証することはできません。このようなアプリケーションの名前として、URL名に接頭辞を追加し、それが紛争の可能性を削減します。お勧めmyapp-comment
の代わりにcomment
。
名前空間[未完]
名前空間(英語:名前空間)は、可視範囲の識別子です。識別子は、名前空間を複数定義することができ、それは無関係であり、異なる名前空間に意味を有します。この方法では、新しい名前空間に他の名前空間での既存の定義ので、既存の識別子と競合しない任意の識別子を定義することができます。
urls.pyのプロジェクト:
urlpatterns = [ URL(R '^管理/'、admin.site.urls)、 URL( '^ app01 / R'、( "app01.urls"、名前空間は= "app01")を含みます)、 URL( '^ app02 / R'、( "app02.urls"、名前空間は= "app02")を含みます)、 ]
app01.urls:
urlpatterns = [ URL(R '^インデックス/'、インデックス、名前= "インデックス")、 ]
app02.urls:
urlpatterns = [ URL(R '^インデックス/'、インデックス、名前= "インデックス")、 ]
app01.views
django.core.urlresolversインポート逆から デフ指数(要求): (:) "インデックスapp01" を(リバース)はHttpResponseを返します
app02.views
django.core.urlresolversインポート逆から デフ指数(要求): (:) "インデックスapp02" を(リバース)はHttpResponseを返します