Django: переопределение и расширение шаблона приложения - PullRequest
43 голосов
/ 19 октября 2010

Если вы хотите переопределить шаблон, поставляемый с приложением в django (в app / templates / app /), вы создаете шаблон с тем же именем в другом каталоге, который загрузчик шаблонов проверяет перед каталогом шаблона приложения.Если вы просто хотите переопределить определенные блоки шаблона, вы также должны скопировать весь шаблон объявления и изменить этот блок, который на самом деле не очень СУХОЙ.

Кто-нибудь знает способ переопределить оригинальный шаблон, хотя вв тот же момент, расширяя его, так что вам просто нужно переопределить конкретный блок, который вы хотите изменить?(дело в том, что это без изменения имени шаблона, потому что в некоторых случаях вам, возможно, придется изменить представление, чтобы оно работало с другим шаблоном)в комментариях от Django 1.9 на это возможно без всяких взломов.

Ответы [ 6 ]

35 голосов
/ 19 сентября 2011

Я думаю, что ответ от этот связанный вопрос уместен; в настоящее время наилучшим решением, по-видимому, является использование пользовательского загрузчика шаблонов из пакета django-apptemplates на PyPI , поэтому вы можете просто использовать pip для его установки (например, pip install django-apptemplates) .

Загрузчик шаблонов позволяет расширять шаблон в определенном приложении; например, чтобы расширить индексную страницу интерфейса администратора, вы должны добавить

'apptemplates.Loader',

в список TEMPLATE_LOADERS в settings.py и используйте

{% extends "admin:admin/index.html" %}

в ваших шаблонах.

7 голосов
/ 01 октября 2013

Как обновление, поскольку это, кажется, популярный вопрос.Я без проблем использовал приложение overextends .Он предоставляет новые ключевые слова overextends , которые позволяют расширять шаблоны с тем же именем.

И его легко установить с помощью пункта:

 pip install -U django-overextends
4 голосов
/ 11 августа 2016

Django 1.9 и более поздние версии имеют эту функцию :

Загрузчики шаблонов Django теперь могут рекурсивно расширять шаблоны.

Таким образом, вы можете получить файл из app1 с таким содержимым:

app1/templates/example/foobar.html:

<p>I'm from app1</p>
{% block main %}{% endblock %}

И вы можете расширить его с помощью файла app2 (обратите внимание, что имя шаблона example/foobar.html совпадает):

app2/templates/example/foobar.html

{% extends "example/foobar.html" %}
{% block main %}
  <p>I'm from app2</p>
{% endblock %}

Конечный результат должен быть:

<p>I'm from app1</p>
<p>I'm from app2</p>
2 голосов
/ 27 октября 2010

В вики Django Саймон Уиллисон представляет трюк для достижения эффекта «саморасширяющегося шаблона».Однако это не относится напрямую, если вы используете загрузчик шаблонов app_directories.

Каталоги шаблонов приложений с символическими ссылками внутри нового каталога могут помочь.

0 голосов
/ 15 февраля 2013

Один простой способ сделать это:

Допустим, вы хотите расширить и переопределить django / contrib / admin / templates / admin / change_form.html.

Сначала скопируйтеоригинал change_form.html в каталог шаблонов вашего приложения и переименуйте его в что-то вроде myapp / templates / admin / original_change_form.html.(Вы также можете сделать это как символическую ссылку.)

Во-вторых, создайте свой собственный файл change_form.html в myapp / templates / admin.Вверху поставьте следующее:

{% extends "admin/original_change_form.html" %}

Simple!

0 голосов
/ 19 октября 2010

[обновление]

Я неправильно понял вопрос, мой первоначальный ответ относится только к приложению администратора, которое имеет встроенный механизм расширения шаблонов.Для другого приложения, в котором отсутствует такой механизм, я бы просто раскошелил оригинальные шаблоны вместо того, чтобы возиться с пользовательскими загрузчиками шаблонов, как рекомендует выбранный ответ.Если вы беспокоитесь о разветвлении, вы также можете реализовать механизм расширения и внести свой вклад в первоначальный проект, если считаете, что он того стоит.


[оригинальный ответ]

Прямо изfine manual : Из-за модульной конструкции шаблонов администратора обычно нет необходимости и нецелесообразно заменять весь шаблон.Почти всегда лучше переопределить только тот раздел шаблона, который необходимо изменить.

Чтобы продолжить приведенный выше пример, мы хотим добавить новую ссылку рядом с инструментом «История» для модели страницы.Посмотрев на change_form.html, мы определим, что нам нужно только переопределить блок object-tools.Поэтому вот наш новый change_form.html:

{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
  <ul class="object-tools">
    <li><a href="history/" class="historylink">{% trans "History" %}</a></li>
    <li><a href="mylink/" class="historylink">My Link</a></li>
    {% if has_absolute_url %}
        <li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">
            {% trans "View on site" %}</a>
        </li>
    {% endif%}
  </ul>
{% endif %}{% endif %}
{% endblock %}

И это все!Если мы поместим этот файл в каталог templates / admin / my_app, наша ссылка появится в форме изменения каждой модели.

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