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

94

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

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

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

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

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

  • 1
    Копирование шаблонов администратора, их расширение и переопределение / добавление блоков является наиболее эффективным, хотя и не оптимальным рабочим процессом, учитывая текущее состояние Django. Я не видел другого способа сделать то, что вы пытаетесь сделать за три года работы с ним :)
  • 0
    Ну, я не знаю, хорошо это или нет, но по крайней мере такие люди, как вы, пришли к такому же выводу. Приятно слышать. :)
Теги:
django-admin

10 ответов

96
Лучший ответ

Обновление:

Прочтите Документы для своей версии 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 из приложения admin. Как это:

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

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

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

  • 16
    Для справки; рассматриваемый фрагмент был преобразован в приложение django и доступен в PyPi (pip / easy_install) в виде django-apptemplates: pypi.python.org/pypi/django-apptemplates
  • 8
    Просто, чтобы быть на 100% явным: вышеупомянутое решение не будет работать больше для последних версий Django (по крайней мере, 1.4), поскольку одна из функций, используемых скриптом, устарела. Вы можете найти обновленный источник здесь
Показать ещё 1 комментарий
57

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

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

    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 admin/templates. Я использую virtualenv, поэтому для меня путь здесь:

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

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

  1. В your change_form.html напишите что-нибудь вроде этого:

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

  • 0
    Этого все еще недостаточно для расширения основного шаблона index.html без копирования всех блоков. Решение состоит в том, чтобы записать некоторый ../ в путь «exetends» и указать более уникальный исходный путь {% extends "../../admin/templates/admin/index.html" %} . ссылка на ответ
  • 1
    Я думаю, что в шаблонах мы должны использовать 'DIRS': [os.path.join (BASE_DIR, 'templates')],
Показать ещё 2 комментария
41

если вам нужно перезаписать 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

  • 4
    Brilliant! Это позволяет вам затем сделать {% extends "admin/index.html" %} из my_custom_index.html и получить ссылку на шаблон администратора django, не копируя его. Спасибо.
  • 3
    @Semmel должен пометить это как правильный ответ, так как это самый простой подход, который использует встроенные функции django и не требует использования пользовательских загрузчиков шаблонов.
11

С 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 (или нет, если вы хотите сделать это с нуля)

6

Ответ Chengs верен, однако в соответствии с административными документами не каждый шаблон администратора может быть перезаписан следующим образом: 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. Это особенно полезно для создания пользовательских 404 и 500 страниц

Мне пришлось перезаписать login.html администратора и, следовательно, пришлось поместить перезаписанный шаблон в эту структуру папок:

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

(без подпапки myapp в админе). Мне не хватает отражения для комментариев в сообщении Cheng, поэтому мне пришлось написать это как новый ответ.

  • 0
    Спасибо за отзыв, Гинекер. Надеюсь, мой ответ яснее и точнее.
  • 0
    Да, полезно знать, что шаблоны можно настраивать на уровне проекта, даже если некоторые из них можно изменить на уровне приложения.
5

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

Шаблоны/админ/change_form.html

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

Your stuff here

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

  • 0
    Использование SVN Externals - отличная идея. Проблема, которую это представляет, состоит в том, что все мои переводчики собираются переводить все эти шаблоны (потому что makemessages будет собирать строки перевода из всех шаблонов администратора), что добавляет много дополнительной работы, если вы работаете с несколькими языками. Может быть, есть способ исключить эти шаблоны из makemessages?
  • 0
    Используйте --ignore аргумент с makemessages . Смотрите: docs.djangoproject.com/en/dev/ref/django-admin/#makemessages
Показать ещё 1 комментарий
1

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

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

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

0

для индекса приложения добавьте эту строку в какой-нибудь общий py файл, такой как url.py

admin.site.index_template = 'admin/custom_index.html'

для индекса модуля приложения: добавьте эту строку в admin.py

admin.AdminSite.app_index_template = "servers/servers-home.html"

для списка изменений: добавьте эту строку в класс администратора:

change_list_template = "servers/servers_changelist.html"

для шаблона формы модуля приложения: добавьте эту строку в класс администратора

change_form_template = "servers/server_changeform.html"

и т.д. и найти другие в том же классе модуля администратора

0

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

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

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

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

И в разделе "Группы Google" обсуждение (https:/groups.google.com/forum/#! topic/mezzanine-users/sUydcf_IZkQ), которое запустило разработку этой функции.

Примечание:

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

0

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

FIRST: Составьте символическую ссылку с именем 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...

ТРЕТЬЯ: В вашем новом каталоге template/admin/создайте файл base.html с этим контентом:

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

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

ЧЕТВЕРТЫЙ: Добавьте свой admin favicon-admin.ico в свою статическую папку с корневым корнем.

Готово. Легко.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню