Django: Как переопределить URL-адреса приложений в моем проекте urlconf? - программирование
Подтвердить что ты не робот

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. Есть ли другое решение, которое мне не хватает?

4b9b3361

Ответ 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.