Бесконечная рекурсия при расширении шаблона change_form приложения администратора - PullRequest
12 голосов
/ 11 февраля 2011

У меня есть следующий шаблон в 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

Ответы [ 6 ]

13 голосов
/ 10 марта 2013

Я знаю, что уже поздно, но ...

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

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

Он будет использоваться автоматически для каждого приложения, если он называется /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 вместо относительной.

4 голосов
/ 11 февраля 2011

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

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

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

2 голосов
/ 08 июня 2011

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

2 голосов
/ 12 февраля 2011

Кроме того, вы можете указать свой класс 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" %}
1 голос
/ 16 мая 2014

Лучший способ сделать это, как я обнаружил, - это использовать '..', чтобы пройти пару каталогов, а затем вернуться обратно в каталоги, которые можно найти только в базе кода 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 или настройкусимволическая.

0 голосов
/ 04 декабря 2011

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

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

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

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

...