Recursión infinita mientras se extiende la plantilla de aplicación de cambio change_form

Tengo la siguiente plantilla en template/admin/change_form.html :

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

Sin embargo, por alguna razón lanza un

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

Sé que es tarde, pero …

Si se extiende, que es una opción mucho mejor que la duplicación, la clave es tener un nombre que no sea /admin/change_form.html .

(Aunque el OP se refirió a la template/admin/change_form.html , esto se debe simplemente a que una ruta en su tupla TEMPLATE_DIRS termina en ‘/ template’ – la mía generalmente termina en ‘/ templates’ – pero, estos directorios pueden nombrarse de cualquier manera y ubicarse en cualquier sitio.)

Se utilizará automáticamente por aplicación si se denomina /admin//change_form.html

Se utilizará automáticamente por modelo si se denomina /admin///change_form.html

Puede ser nombrado como se especifique explícitamente en ModelAdmin.

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

Finalmente, si insiste en nombrarlo /admin/change_form.html , puede, siempre que la etiqueta /admin/change_form.html contenga la ruta completa a su instalación de django en lugar de una relativa.

Estás en admin/change_form.html y extiendes admin/change_form.html . No puedes extender la misma plantilla en la que estás.

Probablemente esperaba que si reemplaza la plantilla de la aplicación de administración, puede extender la que reemplaza. Pero no es así como funciona. Cuando reemplaza una plantilla, no puede acceder a ella.

La solución a su problema es copiar la plantilla original y cambiar las cosas que no le gustan.

Además, puede apuntar su clase AdminOptions a otra plantilla usando la propiedad change_form_template .

Algo como:

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

Y myapp/my_change_form.html :

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

Yo tuve el mismo problema. Resuelto colocando la plantilla anulada debajo de myapp / templates / admin / myapp en lugar de myapp / templates / admin.

La mejor manera de hacer esto que he encontrado es usar '..' para subir un par de directorios, luego volver a los directorios que solo deberían encontrarse en la base de códigos de Django.

Como las plantillas de Django están en algo como "django/contrib/admin/templates/admin" , encontré que esto me funcionó:

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

Si eso todavía causa un choque con alguna otra estructura que tenga, podría ir más lejos:

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

o incluso:

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

Aunque es un poco intrincado, al menos al hacer lo anterior no tiene que usar otra técnica que implique copiar la fuente de django o configurar un enlace simbólico.

Con el núcleo de Django es imposible. Pero no es imposible.

Copia y pega “la plantilla original y cambia las cosas que no te gustan” es muy feo.

No hagas en las plantillas, lo que no hagas en Python

Esta solución es para cualquier plantilla:

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