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

Как переопределить шаблон администратора (например, admin / index.html), одновременно расширяя его (см. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template)?

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

мой текущий обходной путь - сделать копии и расширить их вместо расширения непосредственно из шаблонов администратора. Это отлично работает, но это действительно запутанно и добавляет дополнительную работу при изменении шаблонов администратора.

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

на стороне Примечание: кто-нибудь знает, будет ли эта проблема решена Django себя?

9 ответов


обновление:

прочитайте документы для вашей версии Django. например,

https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#admin-overriding-templates https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#admin-overriding-templates

оригинальный ответ от 2011:

У меня был тот же вопрос около полутора лет назад, и я нашел хороший загрузчика шаблон на djangosnippets.org это делает это легко. Это позволяет расширить шаблон в определенном приложении, давая вам возможность создать свой собственный admin / index.HTML-код Это расширяет admin / index.HTML шаблон из приложения администратора. Вот так:

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

{% block sidebar %}
    {{block.super}}
    <div>
        <h1>Extra links</h1>
        <a href="/admin/extra/">My extra link</a>
    </div>
{% endblock %}

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


что касается Django 1.8, являющегося текущей версией, нет необходимости в символической ссылке, копировании администратора/шаблонов в папку проекта или установке промежуточных программ, как это предлагается в ответах выше. Вот что нужно сделать:

  1. создайте следующую древовидную структуру(рекомендуется официальная документация)

    your_project
         |-- your_project/
         |-- myapp/
         |-- templates/
              |-- admin/
                  |-- myapp/
                      |-- change_form.html  <- do not misspell this
    

Примечание: расположение этого файла не важно. Вы можете поместить его в свое приложение, и он будет все еще работают. Пока его местоположение может быть обнаружено django. Что еще более важно, имя файла HTML должно быть таким же, как и исходное имя файла HTML, предоставленное django.

  1. добавьте этот путь шаблона в свой settings.py:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')], # <- add this line
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
  2. определите имя и блок, которые вы хотите переопределить. Это делается путем просмотра каталога admin/templates django. Я использую virtualenv, поэтому для меня путь здесь:

    ~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
    

в этом примере я хочу изменить добавить новую форму. Шаблон responsiblve для этого представления -change_form.HTML-код. Открыть change_form.html и найдите {% block%}, который вы хотите расширить.

  1. на ваш change_form.HTML-код, напишите что-нибудь вроде этого:

    {% extends "admin/change_form.html" %}
    {% block field_sets %}
         {# your modification here #}
    {% endblock %}
    
  2. загрузите свою страницу, и вы увидите изменения


если вам нужно заменить admin/index.html, вы можете установить index_template


С django 1.5 (по крайней мере) вы можете определить шаблон, который вы хотите использовать для конкретного modeladmin

см https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#custom-template-options

вы можете сделать что-то вроде

class Myadmin(admin.ModelAdmin):
    change_form_template = 'change_form.htm'

С change_form.html будучи простой html шаблон расширения admin/change_form.html (или нет, если вы хотите сделать его с нуля)


лучший способ сделать это-поместить шаблоны администратора Django в ваш проект. Таким образом, ваши шаблоны будут в templates/admin в то время как шаблоны администратора Django будут в say template/django_admin. Затем вы можете сделать что-то вроде следующего:

шаблоны / admin / change_form.HTML-код

{% extends 'django_admin/change_form.html' %}

Your stuff here

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


ответ Chengs правильный, howewer согласно документам администратора не каждый шаблон администратора может быть перезаписан таким образом: https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#overriding-admin-templates

шаблоны, которые могут быть переопределены в приложение или модель

не каждый шаблон в contrib/admin/templates/admin может быть переопределен за приложение или за модель. Следующее:

app_index.html
change_form.html
change_list.html
delete_confirmation.html
object_history.html

для тех, шаблоны, которые нельзя переопределить таким образом, вы можете по-прежнему переопределять их для всего проекта. Просто место новый версии шаблоны / admin


Я согласен с Крисом Прэттом. Но я думаю, что лучше создать символическую ссылку на оригинальную папку Django, где размещаются шаблоны администратора:

ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/ templates/django_admin

и, как вы можете видеть, это зависит от версии python и папки, в которой установлен Django. Поэтому в будущем или на рабочем сервере вам может потребоваться изменить путь.


этой сайт имел простое решение, которое работало с моей конфигурацией Django 1.7.

первый: создайте символическую ссылку с именем admin_src в шаблоне/ каталоге вашего проекта для установленных шаблонов Django. Для меня на Dreamhost с помощью virtualenv, мои" исходные " шаблоны администратора Django были в:

~/virtualenvs/mydomain/lib/python2.7/site-packages/django/contrib/admin/templates/admin

второй: создать admin в шаблонах/

Так что мой шаблон/ каталог проекта теперь выглядел так:

/templates/
   admin
   admin_src -> [to django source]
   base.html
   index.html
   sitemap.xml
   etc...

третий: в Вашем новом шаблоне/admin/ directory создайте базы.HTML-код файл с таким содержанием:

{% extends "admin_src/base.html" %}

{% block extrahead %}
<link rel='shortcut icon' href='{{ STATIC_URL }}img/favicon-admin.ico' />
{% endblock %}

четвертое: добавить ваш админ favicon-админ.ico в вашу статическую корневую папку img.

сделано. Простой.


можно использовать django-overextends, который обеспечивает круговое наследование шаблонов для Django.

происходит от Мезонин CMS, откуда Стивен извлек его в автономное расширение Django.

больше информации вы найдете в разделе "переопределение vs расширение шаблонов" (http:/mezzanine.jupo.org/docs/content-architecture.html#overriding-vs-extending-templates) внутри мезонина.

для более глубоких внутренностей посмотрите на Стивенса Блог "Круговое наследование шаблонов для Django" (http:/blog.jupo.org/2012/05/17/circular-template-inheritance-for-django).

и в Google группах обсуждение (https:/groups.google.com/forum#!тема/мезонин-пользователи/sUydcf_IZkQ), с которого началась разработка этой функции.

Примечание:

У меня нет репутации, чтобы добавить более 2 ссылок. Но я думаю, что ссылки на интересную справочную информацию. Поэтому я просто оставил косую черту после " http(S):". Возможно, кто-то с лучшей репутацией может восстановить ссылки и удалить эту заметку.