variable template ifequal get_template for examples python django django-templates

template - Python/Django-Si la declaración en la plantilla se extiende alrededor



import django template (4)

Estaba buscando la solución del mismo problema y tuve una solución un poco mejor que la sugerida por Klaus Byskov Hoffmann . Es mejor porque no tiene que tener 2 plantillas base separadas para solicitudes ajax y no ajax y, lo que es más importante, no tiene que definir la instrucción if que definirá qué plantilla base usar en CADA controlador.

En su caso la solución sería:

page.html

{% extends "/base.html" %} {% block body %} hello world {% endblock body %}

base.html

{% if not ajax %} <html> <head></head> <body> LOGO and other stuff... {% endif %}{% block body %}{% endblock body %}{% if not ajax %} FOOTER </body> </html> {% endif %}

Por lo tanto, base.html siempre se incluye pero imprime su contenido solo cuando not ajax .

ACTUALIZACIÓN: esto se puede simplificar creando y agregando un nuevo ConextProcessor que poblará la variable de contexto ajax de HttpRequest.is_ajax() , para que no tenga que hacer nada adicional en sus controladores y plantillas.

Me gustaría tener una plantilla que se extienda de forma condicional. Básicamente, cuando una variable llamada "ajax" es verdadera NO QUIERO que la plantilla extienda otra.

{% if not ajax %} {% extends "/base.html" %} {% endif %}

¿Alguna pista?


No puedes hacerlo así. Sin embargo, puede establecer una variable y usarla para elegir la plantilla a extender:

{% extends my_template %}

Luego en el código python escribes algo como:

if ajax: template_values[''my_template''] = ''base_ajax.html'' else: template_values[''my_template''] = ''base.html''

Es posible que desee consultar la documentación para obtener más información.


Si bien no puede ajustar las extends en bloques lógicos, ya que debe ser la primera etiqueta si se usa, aún puede aceptar variables, incluidos los filtros. Esto debe ajustarse a su propósito muy bien:

{% extends ajax|yesno:"base_ajax.html,base.html" %} {# stuff #}

Nota: el filtro yesno también acepta valores nulos ( None ) como tercera opción, y si no especifica uno (como en este caso), cambiará a convertirlo en False (es decir, devolverá la segunda opción). Esto le permite no especificar la variable ajax en su plantilla sin romperla.

Sugerido por el usuario Rafael :

{% extends request.is_ajax|yesno:"base_ajax.html,base.html" %} {# stuff #}

Esto solo funcionará si está utilizando un contexto RequestContext lugar de un objeto de Context simple y tiene el procesador de contexto de request habilitado, o alternativamente, si inserta el objeto de solicitud en el contexto de su plantilla.


Si no desea "extender" una plantilla principal, siempre puede crear un archivo vacío llamado null.html y extenderlo. Tipo de hacky, pero fácil de entender.