Django: форматы urlpatterns в urls.py
Я заметил, что в Django есть два формата urlpatterns
в файле urls.py
:
urlpatterns = [
url(...),
url(...),
]
и
urlpatterns = pattern('',
url(...),
url(...),
)
Первый представляет собой список экземпляров url
, а второй вызывает модуль pattern
с пустой строкой и числом экземпляров url
в качестве параметров.
- В чем разница между двумя?
- Какова цель пустой строки во втором формате?
- Какой из них рекомендуется использовать?
Ответы
Ответ 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()
?" ).