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.