usar template plantillas para descargar bootstrap python django django-templates

python - template - ¿Cuál es la mejor manera de duplicar datos en una plantilla django?



django views (4)

Parece que tu diseño es sólido. Tienes una plantilla base.html que define la estructura básica y el diseño externo de cada página en tu aplicación. También tiene base_object.html que extiende esta plantilla.

Desea que cada página tenga un título único y una h1 coincidente (creo). La mejor forma de hacerlo es definir dos bloques separados en su plantilla base.html.

<html> <head> <title>{% block title %}Default Title{% endblock %}</title> </head> <body> <h1>{% block h1 %}{% endblock %}</h1> </body> </html>

En las plantillas de su hijo, debe anular ambas si desea que sean idénticas. Sé que sientes que esto no es intuitivo, pero es necesario debido a la forma en que se maneja la herencia de la plantilla en Django.

Fuente: El lenguaje de plantilla de Django

Finalmente, tenga en cuenta que no puede definir múltiples etiquetas {% block %} con el mismo nombre en la misma plantilla. Esta limitación existe porque una etiqueta de bloque funciona en "ambas" direcciones. Es decir, una etiqueta de bloque no solo proporciona un hueco para llenar, también define el contenido que llena el agujero en el elemento primario. Si hubiera dos etiquetas con el mismo nombre {% block %} en una plantilla, el padre de esa plantilla no sabría cuál de los contenidos de los bloques usar.

Los niños se ven así:

{% extends "base.html" %} {% block title %}Title{% endblock %} {% block h1 %}Title{% endblock %}

Si esto le molesta, debe establecer el título de la vista para cada objeto como una variable de plantilla.

{% block title %}{{ title }}{% endblock %} {% block h1 %}{{ title }}{% endblock %}

Django se esfuerza por mantener la mayor cantidad de lógica fuera de la capa de la plantilla como sea posible. A menudo, un título se determina dinámicamente desde la base de datos, por lo que la capa de vista es el lugar perfecto para recuperar y establecer esta información. Todavía puede dejar el título en blanco si desea diferir al título predeterminado (tal vez establecido en base.html , o puede obtener el nombre del sitio del paquete django.contrib.sites )

También {{ block.super }} puede ser útil. Esto le permitirá combinar los contenidos del bloque padre con contenidos adicionales del niño. Así que podrías definir un título como "Stackoverflow.com" en la base, y establecer

{% block title %}{{ block.super }} - Ask a Question{% endblock %}

en el niño para obtener un título como "Stackoverflow.com - Haz una pregunta"

Esta pregunta ya tiene una respuesta aquí:

<html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>{% block title %}{% endblock %}</h1> </body> </html>

Esta es mi plantilla, más o menos. El encabezado h1 es siempre el mismo que la etiqueta del título. El fragmento de código anterior no es válido porque no puede haber dos bloques con el mismo nombre. ¿Cómo manejo esto sin repetirme?

editar para aclarar: tengo una tonelada de plantillas secundarias que se heredan de esta plantilla, por lo que crear una nueva {{título}} variable para cada plantilla no es una solución muy buena. Previamente lo tenía configurado así:

base.html:

<title>{% block title %}{% endblock %}</title>

luego en base_view.html (extendiendo base.html):

<h1>{% block title %}{% endblock %}</h1>

luego en base_object.html (extendiendo base_view.html):

{% block title %}my title goes here{% endblock %}

y simplemente funcionó de alguna manera. Refactoreé mis plantillas así que solo hay base.html y base_object.html ¿Cómo puedo recuperar esta funcionalidad?


{% extends "base.html" %} {% with "Entry Title" as title %} {% block title %}{{ title }}{% endblock %} {% block h1 %}{{ title }}{% endblock %} {% endwith %}

Eso podría funcionar si realmente te preocupa mantener el title fuera de los puntos de vista y no repetirlo.


En base.html:

<head> <title>{% block title %}{% endblock %}</title> </head> <body> <h1>{% block h1 %}{% endblock %}</h1> </body>

Luego, haga otra capa "base" sobre la llamada content_base.html (o algo):

{% extends "base.html" %} {% block h1 %}{% block title %}{% endblock %}{% endblock %}

Ahora haz que todas tus otras plantillas extiendan content_base.html. Todo lo que pones en el "título" del bloque en todas tus plantillas irá a los bloques "título" y "h1" en base.html.


Pase una variable a su plantilla, tal vez llamada título. Luego reemplace su bloque de título con {{título}}. Para pasar esto a su plantilla en su vista, asegúrese de tener:

def myview(request): t = loader.get_template("mypage.html") title = "My Title" c = Context({"title" : title }) HttpResponse(t.render(c))

Luego en su plantilla tendrá:

<html> <head> <title>{{ title }}</title> </head> <body> <h1>{{ title }}}</h1> </body>

Ver también: Cómo repetir un "bloque" en una plantilla django