2009-07-24 5 views
15
<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?¿Cuál es la mejor manera de duplicar datos en una plantilla django?


edición de aclarar: Tengo un montón de plantillas hijas que se hereda de éste plantilla, y así hacer una nueva {{title}} variable para cada plantilla no es una solución muy buena. Anteriormente lo tenía configurado como esto:

base.html:

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

entonces en base_view.html (base.html extiende):

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

entonces en base_object.html (que se extiende base_view.html):

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

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

Respuesta

8

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"

1

Pase una variable a su plantilla, tal vez llamada título. Luego reemplace su bloque de título con {{título}}. Para pasar esta en su plantilla, en su opinión asegúrese de que tiene:

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

Luego, en su plantilla que tendrá:

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

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

Ver también: How to repeat a "block" in a django template

+0

Así no se debe usar Django. –

+0

@Frank Crook: cuidado de explicar? –

+0

@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. –

8
{% extends "base.html" %} 

{% with "Entry Title" as title %} 
    {% block title %}{{ title }}{% endblock %} 
    {% block h1 %}{{ title }}{% endblock %} 
{% endwith %} 

Eso podría funcionar si usted es realmente preocupado por mantener title fuera de las vistas y no repetir usted mismo.

20

En base.html:

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

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

A continuación, crea otra capa "base" en la parte superior de esa llamada content_base.html (o algo así):

{% extends "base.html" %} 

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

Ahora tienen todas las otras plantillas extender 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.

+0

Ouch, pero supongo que funcionará. – mlissner

Cuestiones relacionadas