web-dev-qa-db-ja.com

Django:urls.pyのurlpatternsのフォーマット

Django=には、ファイルurls.pyurlpatternsの2つの形式があります。

urlpatterns = [
    url(...),
    url(...),
]

そして

urlpatterns = pattern('',
    url(...),
    url(...),
)

最初はurlインスタンスのリストであり、2番目は空の文字列といくつかのpatternインスタンスをパラメーターとして使用してurlモジュールを呼び出します。

  1. 2つの違いは何ですか?
  2. 2番目の形式の空の文字列の目的は何ですか?
  3. どちらを使用することをお勧めしますか?
23
Randy Tang

Django 1.8+では、urlpatternsは単にurl() sのリストでなければなりません。この新しい構文は実際には1.7でも機能します。

urlpatterns = [
    url(...),
    url(...),
]

pattern非推奨 in Django 1.8を使用し、Django 1.10で削除されました。

urlpatterns = pattern('',
    url(...),
    url(...),
)

古い構文では、プレフィックスを指定できます。 ドキュメント内 の例は

urlpatterns = patterns('news.views',
    url(r'^articles/([0-9]{4})/$', 'year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'),
)

ただし、ビューに文字列引数を使用することも非推奨になったため、代わりにcallableを提供する必要があります。

33
Alasdair

ドキュメントpatternsごと:

プレフィックスと任意の数のURLパターンを取り、Django needs。の形式でURLパターンのリストを返す関数。

patterns()の最初の引数は、文字列prefixです。

また、使用する理由の例を示します。

from Django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^articles/([0-9]{4})/$', 'news.views.year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'news.views.month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'news.views.article_detail'),
)

この例では、各ビューには共通の接頭辞'news.views'があります。 urlpatternsのエントリごとに入力する代わりに、patterns()関数の最初の引数を使用して、各ビュー関数に適用するプレフィックスを指定できます。

これを念頭に置いて、上記の例をより簡潔に次のように書くことができます。

from Django.conf.urls import patterns, url

urlpatterns = patterns('news.views',
    url(r'^articles/([0-9]{4})/$', 'year_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', 'month_archive'),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', 'article_detail'),
)

ただし、この関数は廃止されることに注意してください。

バージョン1.8から非推奨:

urlpatternsは、代わりにDjango.conf.urls.url()インスタンスの単純なリストでなければなりません。

理由の説明 には以下が含まれることに注意してください(明確な理由があります!):

したがって、patterns()はほとんど目的を果たさず、新しいユーザーに教えるときに負担になります(初心者の質問に答える"なぜpatterns()?の最初の引数としてこの空の文字列が必要なのですか?)。

7
jonrsharpe