Как переопределить и расширить основные шаблоны администратора 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
Примечание: расположение этого файла не имеет значения. Вы можете поместить его в свое приложение, и он будет все еще работают. Пока его местоположение может быть обнаружено Джанго. Что еще более важно, имя 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. Я использую virtualenv, поэтому для меня путь здесь:
~/.virtualenvs/edge/lib/python2.7/site-packages/django/contrib/admin/templates/admin
в этом примере я хочу изменить добавить новую форму. Шаблон, ответственный за это представление,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 параметр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 на складе будут в saytemplate/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):". Возможно, кто-то с лучшей репутацией может восстановить ссылки и удалить эту заметку.