Подтвердить что ты не робот

Django: форматы urlpatterns в urls.py

Я заметил, что в Django есть два формата urlpatterns в файле urls.py:

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

и

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

Первый представляет собой список экземпляров url, а второй вызывает модуль pattern с пустой строкой и числом экземпляров url в качестве параметров.

  • В чем разница между двумя?
  • Какова цель пустой строки во втором формате?
  • Какой из них рекомендуется использовать?
4b9b3361

Ответ 1

В Django 1.8+ urlpatterns должен просто быть списком url() s. Этот новый синтаксис фактически работает и в 1.7.

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

Старый синтаксис с использованием pattern устарел в 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'),
)

Однако использование аргументов строк для представления также устарело, и вместо этого вы должны указать вызываемый.

Ответ 2

Per документация, patterns:

Функция, которая принимает префикс, и произвольное количество URL-адресов шаблонов и возвращает список шаблонов URL в формате Django необходимо.

Первым аргументом 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() служит небольшой цели и является обузой при обучении новые пользователи (отвечая на вопрос новичков "зачем мне это пустое string как первый аргумент patterns()?" ).