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