Рекурсия Infinte при расширении шаблона изменения приложения admin

У меня есть следующий шаблон в template/admin/change_form.html:

{% extends "admin/change_form.html" %}
{% block extrahead %}
  {% include "dojango/base.html" %}
  {% block dojango_content %}
  {% endblock %}
{% endblock %}

Однако по какой-то причине он выбрасывает

TemplatesyntaxError: TemplateSyntaxError at /admin/cms/post/add/
Caught RuntimeError while rendering: maximum recursion depth exceeded while calling a Python object

Может ли кто-нибудь сказать мне, что я делаю неправильно?

Ответ 1

Я знаю это поздно, но...

Если расширение - это гораздо лучший вариант, чем дублирование - ключ должен состоять в том, чтобы он назвал что-либо , кроме /admin/change_form.html.

(Хотя OP относится к template/admin/change_form.html, это просто потому, что путь в его кортеже TEMPLATE_DIRS заканчивается на '/template' - мой обычно заканчивается на '/templates' - но эти каталоги можно назвать чем угодно и располагаться где угодно.)

Он будет использоваться автоматически для каждого приложения, если named /admin/<MyAppName>/change_form.html

Он будет использоваться автоматически на основе каждой модели, если имя /admin/<MyAppName>/<MyModelName>/change_form.html

Его можно назвать любым, если явно указано в ModelAdmin

class MyModelAdmin(admin.ModelAdmin):
    change_form_template = 'subdir/my_change_form.html'

Наконец, если настойчиво называть его /admin/change_form.html, вы можете - при условии, что тег extends содержит полный путь к вашей установке django, а не относительный.

Ответ 2

Вы находитесь в admin/change_form.html и расширяете admin/change_form.html. Вы не можете расширить тот же шаблон, в котором находитесь.

Вероятно, вы ожидали, что если вы переопределите шаблон из приложения admin, вы можете расширить тот, который вы переопределите. Но это не так, как это работает. Когда вы переопределяете шаблон, вы не можете получить к нему доступ.

Решение вашей проблемы - скопировать исходный шаблон и изменить то, что вам не нравится.

Ответ 3

Кроме того, вы можете указать свой класс AdminOptions на другой шаблон, используя свойство change_form_template.

Что-то вроде:

class MyOptions(AdminOptions):
    change_form_template = 'myapp/my_change_form.html'

И myapp/my_change_form.html:

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

Ответ 4

У меня была та же проблема. Решен путем размещения переопределенного шаблона под myapp/templates/admin/myapp вместо myapp/templates/admin.

Ответ 5

Лучший способ сделать это, который я нашел, - использовать '..', чтобы перейти в пару каталогов, а затем вернуться в директории, которые должны быть найдены только в базе кода Django.

Поскольку шаблоны Django находятся в чем-то вроде "django/contrib/admin/templates/admin", я обнаружил, что это сработало:

{% extends "../../admin/templates/admin/change_form.html" %}

Если это все еще вызывает столкновение с какой-либо другой структурой, вы можете продолжить:

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

или даже:

{% extends "../../../../django/contrib/admin/templates/admin/change_form.html" %}

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

Ответ 6

С ядром Django это невозможно. Но это не невозможно.

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

Не делайте в шаблонах, что бы вы не делали в python

Это решение для любого шаблона:

http://pypi.python.org/pypi/django-smart-extends