Как переопределить шаблон администратора (например, admin/index.html), в то же время расширяя его (см. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-vs-replacing-an-admin-template)
Во-первых - я знаю, что этот вопрос задавали и отвечали раньше (см. Django: переопределение и расширение шаблона приложения), но, как ответ говорит, что это не прямо применимо, если вы используете загрузчик шаблонов app_directories (что больше всего времени).
Моим текущим обходным путем является создание копий и их расширение, а не расширение непосредственно из шаблонов администратора. Это отлично работает, но это действительно запутывает и добавляет дополнительную работу при изменении шаблонов администратора.
Он может подумать о некотором пользовательском расширительном теге для шаблонов, но я не хочу изобретать колесо, если уже существует решение.
На стороне примечания: Кто-нибудь знает, будет ли эта проблема решаться самим Django?
Обновление:
Прочтите Документы для своей версии 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 %}
Я привел полный пример того, как использовать этот загрузчик шаблонов в блоге на моем сайте.
Что касается текущей версии Django 1.8, нет необходимости в symlink, копировать администратор/шаблоны в вашу папку проекта или устанавливать middlewares, как было предложено выше. Вот что делать:
создать следующую древовидную структуру (рекомендуется официальной документацией )
your_project
|-- your_project/
|-- myapp/
|-- templates/
|-- admin/
|-- myapp/
|-- change_form.html <- do not misspell this
Примечание. Местоположение этого файла не имеет значения. Вы можете поместить его в свое приложение, и оно все равно будет работать. Пока его местоположение может быть обнаружено джанго. Что еще более важно, имя файла HTML должно совпадать с именем исходного HTML файла, предоставленным django.
Добавьте этот путь к вашему шаблону 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',
],
},
},
]
Определите имя и блок, которые вы хотите переопределить. Это делается путем поиска в каталоге django admin/templates. Я использую virtualenv, поэтому для меня путь здесь:
~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
В этом примере я хочу изменить новую пользовательскую форму. Шаблон answeriblve для этого представления change_form.html. Откройте файл change_form.html и найдите {% block%}, который вы хотите расширить.
В your change_form.html напишите что-нибудь вроде этого:
{% extends "admin/change_form.html" %}
{% block field_sets %}
{# your modification here #}
{% endblock %}
Загрузите свою страницу, и вы увидите изменения
../
в путь «exetends» и указать более уникальный исходный путь {% extends "../../admin/templates/admin/index.html" %}
. ссылка на ответ
если вам нужно перезаписать 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
{% extends "admin/index.html" %}
из my_custom_index.html и получить ссылку на шаблон администратора django, не копируя его. Спасибо.
С 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
(или нет, если вы хотите сделать это с нуля)
Ответ 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, поэтому мне пришлось написать это как новый ответ.
Лучший способ сделать это - разместить шаблоны администратора Django внутри вашего проекта. Таким образом, ваши шаблоны будут в templates/admin
, в то время как шаблоны admin в Django будут в состоянии сказать template/django_admin
. Затем вы можете сделать что-то вроде следующего:
Шаблоны/админ/change_form.html
{% extends 'django_admin/change_form.html' %}
Your stuff here
Если вы беспокоитесь о том, чтобы обновлять шаблоны акций, вы можете включить их с внешними внешними или другими.
--ignore
аргумент с makemessages
. Смотрите: docs.djangoproject.com/en/dev/ref/django-admin/#makemessages
Я согласен с Крисом Праттом. Но я думаю, что лучше создать символическую ссылку в оригинальную папку Django, где шаблоны admin размещаются в:
ln -s /usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/admin/ templates/django_admin
и, как вы можете видеть, это зависит от версии python и папки, в которой установлен Django. Поэтому в будущем или на производственном сервере вам может понадобиться изменить путь.
для индекса приложения добавьте эту строку в какой-нибудь общий 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"
и т.д. и найти другие в том же классе модуля администратора
Вы можете использовать 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) я просто отказался от косой черты:". Возможно, кто-то с лучшей репутацией может восстановить ссылки и удалить эту заметку.
Этот сайт имел простое решение, которое работало с моей конфигурацией 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 в свою статическую папку с корневым корнем.
Готово. Легко.