Как переопределить и расширить базовые шаблоны администратора 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, являющегося текущей версией, нет необходимости в символической ссылке, копировании администратора/шаблонов в папку проекта или установке промежуточных программ, как это предлагается в ответах выше. Вот что нужно сделать:
-
создайте следующую древовидную структуру(рекомендуется официальная документация)
your_project |-- your_project/ |-- myapp/ |-- templates/ |-- admin/ |-- myapp/ |-- change_form.html <- do not misspell this
Примечание: расположение этого файла не важно. Вы можете поместить его в свое приложение, и он будет все еще работают. Пока его местоположение может быть обнаружено django. Что еще более важно, имя файла 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', ], }, }, ]
-
определите имя и блок, которые вы хотите переопределить. Это делается путем просмотра каталога admin/templates django. Я использую virtualenv, поэтому для меня путь здесь:
~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
в этом примере я хочу изменить добавить новую форму. Шаблон responsiblve для этого представления -change_form.HTML-код. Открыть change_form.html и найдите {% block%}, который вы хотите расширить.
-
на ваш change_form.HTML-код, напишите что-нибудь вроде этого:
{% extends "admin/change_form.html" %} {% block field_sets %} {# your modification here #} {% endblock %}
загрузите свою страницу, и вы увидите изменения
если вам нужно заменить 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):". Возможно, кто-то с лучшей репутацией может восстановить ссылки и удалить эту заметку.