Как переопределить и расширить базовые шаблоны администратора Django? - PullRequest
105 голосов
/ 05 июля 2011

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

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

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

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

С другой стороны: кто-нибудь знает, будет ли эта проблема решаться самим Джанго?

Ответы [ 11 ]

96 голосов
/ 05 июля 2011

Обновление :

Прочитайте Документы для вашей версии 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 %}

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

64 голосов
/ 02 мая 2015

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

  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 admin / templates. Я использую 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. Загрузите страницу и увидите изменения

44 голосов
/ 26 декабря 2013

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

13 голосов
/ 21 июня 2013

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

7 голосов
/ 19 августа 2016

Ответ Ченга верный, однако, согласно документации администратора, не каждый шаблон администратора может быть перезаписан следующим образом: 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 в админке) У меня недостаточно репутации, чтобы комментировать пост Ченга, поэтому мне пришлось написать это как новый ответ.

5 голосов
/ 05 июля 2011

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

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

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

Your stuff here

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

1 голос
/ 02 марта 2019

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

Принимая стандартную структуру проекта Django:

mysite-container/         # project container directory
    manage.py
    mysite/               # project package
        __init__.py
        admin.py
        apps.py
        settings.py
        urls.py
        wsgi.py
    app1/
    app2/
    ...
    static/
    templates/

Вот что вам нужно сделать:

  1. В mysite/admin.py создайте подкласс AdminSite:

    from django.contrib.admin import AdminSite
    
    
    class CustomAdminSite(AdminSite):
        # set values for `site_header`, `site_title`, `index_title` etc.
        site_header = 'Custom Admin Site'
        ...
    
        # extend / override admin views, such as `index()`
        def index(self, request, extra_context=None):
            extra_context = extra_context or {}
    
            # do whatever you want to do and save the values in `extra_context`
            extra_context['world'] = 'Earth'
    
            return super(CustomAdminSite, self).index(request, extra_context)
    
    
    custom_admin_site = CustomAdminSite()
    

    Обязательно импортируйте custom_admin_site в admin.py ваших приложений и зарегистрируйте в нем свои модели, чтобы отобразить их на своем настроенном административном сайте (если хотите).

  2. В mysite/apps.py создайте подкласс AdminConfig и установите default_site на admin.CustomAdminSite из предыдущего шага:

    from django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
    
  3. В mysite/settings.py замените django.admin.site в INSTALLED_APPS на apps.CustomAdminConfig (конфигурация пользовательского приложения администратора из предыдущего шага).

    from django.contrib.admin.apps import AdminConfig
    
    
    class CustomAdminConfig(AdminConfig):
        default_site = 'admin.CustomAdminSite'
    
  4. В mysite/urls.py замените admin.site.urls с URL-адреса администратора на custom_admin_site.urls

    from .admin import custom_admin_site
    
    
    urlpatterns = [
        ...
        path('admin/', custom_admin_site.urls),
        # for Django 1.x versions: url(r'^admin/', include(custom_admin_site.urls)),
        ...
    ]
    
  5. Создайте шаблон, который вы хотите изменить, в своем каталоге templates, сохраняя структуру каталога шаблонов администратора Django по умолчанию, указанную в docs . Например, если вы изменяли admin/index.html, создайте файл templates/admin/index.html.

    Все существующие шаблоны могут быть изменены таким образом, а их имена и структуры можно найти в Исходном коде Django .

  6. Теперь вы можете либо переопределить шаблон, написав его с нуля, либо расширить его, а затем переопределить / расширить определенные блоки.

    Например, если вы хотите сохранить все как есть, но хотите переопределить блок content (в котором на странице указателя перечислены приложения и их модели, которые вы зарегистрировали), добавьте следующее к templates/admin/index.html:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
    {% endblock %}
    

    Чтобы сохранить исходное содержимое блока, добавьте {{ block.super }} везде, где вы хотите, чтобы исходное содержимое отображалось:

    {% extends 'admin/index.html' %}
    
    {% block content %}
      <h1>
        Hello, {{ world }}!
      </h1>
      {{ block.super }}
    {% endblock %}
    

    Вы также можете добавлять собственные стили и сценарии, изменяя блоки extrastyle и extrahead.

1 голос
/ 09 марта 2013

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

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

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

0 голосов
/ 12 января 2019

для индекса приложения добавьте эту строку в обычный файл 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 голосов
/ 05 февраля 2016

Вы можете использовать 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):".Возможно, кто-то с лучшей репутацией сможет починить ссылки и удалить эту заметку.

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