Parece al igual que su diseño es sólido. Tiene una plantilla base.html
que define la estructura básica y el diseño externo de cada página en su 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 sus plantillas secundarias, debe anular estas 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: The Django template language
Por último, tenga en cuenta que no se pueden 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 de nombre similar, {% 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 te 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 plantilla 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 se puede dejar en blanco el título si desea aplazar hasta el título predeterminado (tal vez puesto en base.html
, o puede tomar el nombre del sitio desde el 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í se podría 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"
Así no se debe usar Django. –
@Frank Crook: cuidado de explicar? –
@csunwold: Realmente no tengo tiempo, o simplemente habría respondido la pregunta. Para ser breve, la pregunta viene de alguien que tiene un malentendido fundamental sobre cómo funcionan los bloques y la herencia en el sistema de plantillas de Django. Su respuesta no aclara esto para ellos, sino que salta completamente sobre el tema de bloques y herencia y muestra un ejemplo donde no se usan en absoluto. –