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


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

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

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

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

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

9 88

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
    

Примечание: расположение этого файла не имеет значения. Вы можете поместить его в свое приложение, и он будет все еще работают. Пока его местоположение может быть обнаружено Джанго. Что еще более важно, имя 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. определите имя и блок, который вы хотите переопределить. Это делается путем просмотра каталога администратора/шаблонов django. Я использую virtualenv, поэтому для меня путь здесь:

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

в этом примере я хочу изменить добавить новую форму. Шаблон, ответственный за это представление,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 параметр AdminSite.

например

# urls.py
...
from django.contrib import admin

admin.site.index_template = 'admin/my_custom_index.html'
admin.autodiscover()

и поместите свой шаблон в <appname>/templates/admin/my_custom_index.html

С 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. Затем вы можете сделать что-то вроде следующего:

templates / 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

для тех, шаблоны, которые нельзя переопределить таким образом, вы можете тем не менее переопределите их для всего вашего проекта. Просто место новый версия в вашем templates / 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/ каталог создать базы.HTML-код файл с таким содержанием:

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

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

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

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

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

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

больше информации вы найдете в разделе "переопределение и расширение шаблонов" (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/#! topic/mezzanine-users / sUydcf_IZkQ), который начал разработку этой функции.

Примечание:

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