Django: расширить переопределенный шаблон - PullRequest
4 голосов
/ 08 февраля 2012

У меня есть два приложения в моих настройках.INSTALLED_APPS:

INSTALLED_APPS = [
    'application2',
    'application1'
]

и хотите, чтобы application2 изменил шаблон из application1 (например, добавив кнопку).

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

Примечание

Проблема заключается в том, что два шаблона имеют одинаковое имя («mytemplate.html») и одинаковое имя папки («application1»):

\project_root
    \application1\templates\application1\mytemplate.html
    \application2\templates\application1\mytemplate.html

так что я не могу написать:

{% extends "application1\mytemplate.html" %}

потому что оба шаблона называются "application1 \ mytemplate.html".

Ответы [ 3 ]

2 голосов
/ 30 апреля 2012

Я не думаю, что это возможно для описываемого вами случая, поскольку это означает, что порядок INSTALLED_APPS имеет значение. Как это указано в книге Джанго :

Порядок INSTALLED_APPS не имеет значения , но нам нравится хранить все в алфавитном порядке, чтобы человеку было легко читать.

Я понимаю, что это не официальная документация. Однако автором книги являются Адриан Головатый и Джейкоб Каплан-Мосс (создатели Django), так что я верю на слово.

Но если немного подумать об этом, вы поймете, почему заказ не такая уж хорошая идея: Это помогает только в особых случаях. В чуть более сложных случаях это не поможет. E.g.:

  • У вас есть app1, app2, app3.
  • Оба app2 и app3 шаблоны расширения / переопределения app1/a.html и app1/b.html.
  • Вы хотите использовать a.html, как определено в app2 и b.html, как определено в app3.
1 голос
/ 08 февраля 2012

Шаблоны на самом деле не принадлежат приложениям. Они могут быть сгруппированы в каталоги приложений, если хотите, но в значительной степени независимы от них.

Способ переопределить часть шаблона, независимо от того, что приложение предоставило, состоит в том, чтобы наследовать от него, используя {% extends 'template_name.html' %}, а затем определить любые блоки, которые вам нужно переопределить. Конечно, это означает, что в родительском шаблоне должны быть уже определены эти блоки - в противном случае вам потребуется переопределить наименьший соответствующий блок, который определен, и повторить часть содержимого вокруг бита, который нужно изменить.

1 голос
/ 08 февраля 2012

Я не думаю, что это возможно, если у вас нет других имен шаблонов, тогда вы можете использовать {{block.super}}

Как только загрузчик найдет правильный файл, он больше не будет смотреться,поэтому у вас нет доступа к переопределенному шаблону в новом шаблоне.

https://code.djangoproject.com/browser/django/trunk/django/template/loaders/app_directories.py#L57

...