Django: Как мне переопределить предоставленные приложением URL в моем проекте urlconf? - PullRequest
20 голосов
/ 16 февраля 2012

Допустим, у меня есть проект Django с тремя приложениями: foo, bar и glue.Я пытаюсь следовать соглашениям многократно используемых приложений, поэтому foo и bar не зависят (и ничего не знают) друг от друга или от клея.Glue содержит код для интеграции двух других приложений в сайт.

Foo предоставляет тег шаблона, который я хочу включить в одну из страниц, представленных 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 и изменить интересующий меня шаблон. Этот подход нарушает принцип DRY, хотя,Есть ли какое-то другое решение, которое мне не хватает?

Ответы [ 2 ]

26 голосов
/ 18 февраля 2012

Очевидно, что в urlconf разрешены повторяющиеся URL, и первое совпадение в списке будет иметь приоритет:

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')),
)
2 голосов
/ 16 февраля 2012

Непонятно, о чем вы спрашиваете, но, насколько я понимаю, ваш вопрос:

Какой самый элегантный способ передать альтернативный шаблон в представление в баре?

Это не имеет ничего общего с 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 к TEMPLATE_DIRS в settings.py.

Теперь django сначала выполнит поиск в вашем пользовательском каталоге любых запрошенных шаблонов и загрузит ваш альтернативный index.html.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...