vista usar una tutorial template que plantillas con bootstrap django django-templates

usar - Django: redefiniendo Y ampliando una plantilla de aplicación



templates django python (6)

Si desea anular una plantilla que viene con una aplicación en django (en la aplicación / plantillas / aplicación), cree una plantilla con el mismo nombre en otro directorio, que el cargador de plantillas verifique antes del directorio de plantillas de la aplicación. Si solo desea sobrescribir ciertos bloques de la plantilla, también debe copiar toda la plantilla y cambiar el anuncio de ese bloque, que en realidad no es muy SECO.

¿Alguien sabe una manera de anular la plantilla orginial, mientras que al mismo tiempo la extiende, por lo que solo tiene que anular el bloque específico que desea cambiar? (la cosa está haciendo esto sin cambiar el nombre de la plantilla, porque en algunos casos podría tener que cambiar la vista para que funcione con otra plantilla)

EDITAR: Como señaló Adam Taylor en los comentarios de Django 1.9, esto es posible sin ningún tipo de intromisión.


En la wiki de Django, Simon Willison presenta un truco para lograr el efecto de "plantilla autoextendida". Sin embargo, no es directamente aplicable si está usando el cargador de plantillas de los app_directories .

Hacer un enlace simbólico de directorios de plantillas de aplicaciones dentro de un nuevo directorio podría ser un truco.


Una manera simple de hacerlo es esta:

Digamos que desea extender y anular django / contrib / admin / templates / admin / change_form.html.

Primero, copie el change_form.html original en el directorio de plantillas de su aplicación y renómbrelo como myapp / templates / admin / original_change_form.html. (También podría hacer esto como un enlace simbólico).

Segundo, crea tu propio change_form.html en myapp / templates / admin. En la parte superior, coloca lo siguiente:

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

¡Sencillo!


[actualizar]

He leído mal la pregunta, mi respuesta original se aplica solo a la aplicación de administración, que tiene un mecanismo de extensión de plantilla incorporado. Para otra aplicación que carece de dicho mecanismo, simplemente me gustaría mover las plantillas originales en lugar de jugar con cargadoras de plantillas personalizadas, como aconseja la respuesta elegida. Si le preocupa el bifurcación, también puede implementar un mecanismo de extensión y contribuir al proyecto original si cree que vale la pena.

[respuesta original]

Directamente del fino manual : Debido al diseño modular de las plantillas de administrador, generalmente no es necesario ni aconsejable reemplazar una plantilla completa. Casi siempre es mejor anular solo la sección de la plantilla que debe cambiar.

Para continuar con el ejemplo anterior, queremos agregar un nuevo enlace al lado de la herramienta Historial para el modelo de página. Después de mirar change_form.html, determinamos que solo tenemos que anular el bloque de herramientas de objeto. Por lo tanto, aquí está nuestro nuevo change_form.html:

{% extends "admin/change_form.html" %} {% load i18n %} {% block object-tools %} {% if change %}{% if not is_popup %} <ul class="object-tools"> <li><a href="history/" class="historylink">{% trans "History" %}</a></li> <li><a href="mylink/" class="historylink">My Link</a></li> {% if has_absolute_url %} <li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink"> {% trans "View on site" %}</a> </li> {% endif%} </ul> {% endif %}{% endif %} {% endblock %}

¡Y eso es! Si colocamos este archivo en el directorio templates / admin / my_app, nuestro enlace aparecerá en el formulario de cambios de cada modelo.


Como una actualización ya que esta parece ser una pregunta popular. He usado la aplicación de sobreextensiones sin ningún problema. Proporciona una nueva extensión de palabras clave que permite extender plantillas con el mismo nombre.

Y es fácil de instalar con pip:

pip install -U django-overextends


Django 1.9 y posterior tiene esta característica :

Los cargadores de plantillas de Django ahora pueden extender plantillas recursivamente.

Para que pueda tener un archivo de la app1 con contenidos como este:

app1/templates/example/foobar.html :

<p>I''m from app1</p> {% block main %}{% endblock %}

Y puede ampliarlo con un archivo de la app2 ( app2 cuenta que el nombre de la plantilla example/foobar.html es el mismo):

app2/templates/example/foobar.html :

{% extends "example/foobar.html" %} {% block main %} <p>I''m from app2</p> {% endblock %}

El resultado final debe ser:

<p>I''m from app1</p> <p>I''m from app2</p>


Creo que la respuesta de esta pregunta relacionada es pertinente; actualmente, la mejor solución parece ser utilizar un cargador de plantillas personalizado del paquete django-apptemplates en PyPI , por lo que puede usar pip para instalarlo (por ejemplo, pip install django-apptemplates ).

El cargador de plantillas le permite extender una plantilla en una aplicación específica; por ejemplo, para ampliar la página de índice de la interfaz de administrador, agregaría

''apptemplates.Loader'',

a su lista TEMPLATE_LOADERS en settings.py , y use

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

en tus plantillas