Трудность переопределения шаблона администратора Django

Я использую Django 1.2.4 на Ubuntu 10.10. Я пытаюсь переопределить шаблон index.html для модуля admin. Я слежу за этими инструкциями . Я также посмотрел на question, но у меня все еще есть трудности.

В инструкциях говорится создать каталог admin в каталоге шаблонов:

templates/
    admin/
         index.html

Я хочу переопределить один блок в index.html. (Действительно, все, что я хочу сделать, это добавить текст в конец. Есть ли более простой способ, чем копировать/вставлять весь блок и изменять его?) ( Обновление: Похоже, {{block.super}} может помочь.)

Чтобы сигнализировать, что я переопределяю, я помещаю это в начало моего index.html:

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

Конечно, это приводит к переполнению стека (из терминала):

Exception RuntimeError: 'maximum recursion depth exceeded in __subclasscheck__' in <type 'exceptions.RuntimeError'> ignored

Каков правильный способ сделать это? Я попробовал символическую ссылку для ответа на связанный вопрос, но это привело к следующему:

[email protected]:~/foo$ sudo ln -s /usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/ django_admin
[sudo] password for me: 
ln: creating symbolic link `django_admin': Protocol error

Что я делаю неправильно?

Ответ 1

Ошибка рекурсии заключается в том, что вы сами расширяете admin/index.html.

Вы можете:

  • скопируйте весь шаблон admin/index.html в каталог templates/admin/, и он заменит шаблон по умолчанию вашими
  • переопределить index.html для каждого приложения или модели, как описано здесь

Я знаю, что это уже поздно после вопроса, но вы знаете, google travel...

Ответ 2

Измените settings.py с дополнительной папкой шаблона, например:

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates".
    # Always use forward slashes, even on Windows.
    # Don't forget to use absolute paths, not relative paths.
    "/home/mysite/webapps/django/myproject/templates",
    "/home/mysite/webapps/django/lib/python2.7/django/",  # extra folder
)

Затем в myproject/templates/admin добавьте свой собственный index.html, например:

{% extends "contrib/admin/templates/admin/index.html" %}

{% block branding %}
    <h1 id="site-name">Administration for TheLittleButtonCo</h1>
{% endblock %}

Вариации возможны, очевидно. Это работает над окончанием Django 1.3.1

Ответ 3

Не уверен, что вы нашли ответ, но вам нужно изменить

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

к

{% extends "admin/base_site.html" %}

так как перезаписывается исходная страница index.html. Поскольку система Django выполняет поиск в вашей папке шаблонов, прежде чем использовать администратор по умолчанию, так что в этом случае он найдет файл admin/index.html в ваших шаблонах, а затем попытается распространить его на расширение (следовательно, ошибка рекурсии).

Для справки вы можете настроить base_site.html в своих шаблонах, он расширяет base.html. Лучше всего сделать копию оригинала:

/usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/

и вставьте его в папку шаблонов в качестве отправной точки

Ответ 4

Я использую дополнительный пакет, называемый django-smart-extends