Django: Как переопределить URL-адреса приложений в моем проекте urlconf?
Скажем, у меня есть проект Django с тремя приложениями: foo, bar и clue. Я пытаюсь следовать соглашениям о многократных использованиях, поэтому foo и bar не зависят от (и ничего не знают) друг о друге или на клее. Клей содержит код для интеграции двух других приложений на сайт.
Foo поставляет тег шаблона, который я хочу включить на одну из страниц, предоставленных баром. На странице просмотра страницы можно передать альтернативный шаблон. Я делаю шаблон в клее, который расширяет шаблон шаблона и включает тег шаблона из foo. Чтобы передать мой новый шаблон для просмотра, мне нужно изменить запись urlconf, которая указывает на нее.
Мой проект urlconf выглядит примерно так:
urlpatterns = patterns('',
(r'^$', include('glue.urls')),
(r'^foo/', include('foo.urls')),
(r'^bar/', include('bar.urls')),
)
Какой самый элегантный способ передать альтернативный шаблон (или любые другие аргументы произвольного представления, если на то пошло) на представление в строке? Я не хочу изменять bar urlconf напрямую, так как это будет зависеть от клея.
Единственный другой способ, о котором я могу думать, - удалить include('bar.urls')
, скопировать шаблоны url в bar urlconf в проект urlconf и изменить интересующий меня шаблон. Однако этот подход нарушает принцип DRY. Есть ли другое решение, которое мне не хватает?
Ответы
Ответ 1
По-видимому, дублирующие URL-адреса разрешены в urlconf, и первое совпадение будет иметь приоритет:
urlpatterns = patterns('',
(r'^$', include('glue.urls')),
(r'^foo/', include('foo.urls')),
# This will override the same URL in bar urlconf:
(r'^bar/stuff/$', 'glue.views.new_bar_stuff', {'arg': 'yarrgh'}, 'bar_stuff'),
(r'^bar/', include('bar.urls')),
)
Ответ 2
Непонятно, что вы просите, но, насколько я понимаю, ваш вопрос:
Какой самый элегантный способ передать альтернативный шаблон в представление в баре?
Это не имеет никакого отношения к url conf, который просто сопоставляет URL-адреса методам.
Шаблоны в django просматриваются из местоположений TEMPLATE_DIRS
в ваших settings.py, и, самое главное, django перестанет смотреть, как только найдет шаблон.
Если ваш TEMPLATE_DIRS
пуст (как и по умолчанию), django будет искать шаблоны в каталоге templates
внутри любых зарегистрированных приложений (приложения, перечисленные в INSTALLED_APPS
).
Итак, чтобы передать альтернативный шаблон любому приложению, просто создайте файл с тем же именем (и структурой каталогов) в каталоге, указанном в TEMPLATE_DIRS
. Django будет искать это первым и остановится, когда найдет совпадение.
Это так же, как вы переопределяете шаблоны администратора по умолчанию.
В вашем конкретном случае предположим, что вы хотите передать альтернативную версию index.html
в приложение bar
.
Создайте каталог override_templates
где-нибудь в пути к проекту.
Внутри создайте каталог bar/templates/
и добавьте свой настраиваемый index.html
в этот каталог, так что у вас есть override_templates/bar/templates/index.html
.
Добавьте полный путь к override_templates
в TEMPLATE_DIRS
в settings.py
.
Теперь django сначала будет искать ваш пользовательский каталог для любых запрошенных шаблонов и загрузит ваш альтернативный index.html.