2009-07-24 5 views
15
<html> 
    <head> 
     <title>{% block title %}{% endblock %}</title> 
    </head> 

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

Ceci est mon modèle, plus ou moins. L'en-tête h1 est toujours le même que l'étiquette de titre. L'extrait de code ci-dessus n'est pas valide car il ne peut pas y avoir deux blocs portant le même nom. Comment puis-je gérer cela sans me répéter?Quel est le meilleur moyen de dupliquer des données dans un modèle django?


modifier pour clarifier: J'ai une tonne de modèles d'enfants qui sont hérités de celui-modèle, et ainsi faire une nouvelle variable {{title}} pour chaque modèle n'est pas une très bonne solution. Auparavant, je l'avais mis en place comme ceci:

base.html:

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

puis dans base_view.html (extension base.html):

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

puis dans base_object.html (extension base_view.html):

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

et cela a juste fonctionné. J'ai refacturé mes templates donc theres juste base.html, et base_object.html Comment puis-je récupérer cette fonctionnalité?

Répondre

8

Il semble comme votre mise en page est solide. Vous avez un modèle base.html qui définit la structure de base et la disposition externe pour chaque page de votre application. Vous avez également base_object.html qui étend ce modèle.

Vous souhaitez que chaque page possède un titre unique et un h1 correspondant (je pense). Le meilleur moyen de le faire est de définir deux blocs distincts dans votre template base.html.

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

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

Dans vos modèles enfants, vous devez remplacer ces deux modèles si vous souhaitez qu'ils soient identiques. Je sais que vous pensez que cela est contre-intuitif, mais cela est nécessaire en raison de la façon dont l'héritage des templates est géré dans Django.

Source: The Django template language

Enfin, notez que vous ne pouvez pas définir plusieurs balises {% block %} avec le même nom dans le même modèle. Cette limitation existe parce qu'une étiquette de bloc fonctionne dans les deux sens. C'est-à-dire qu'une étiquette de bloc ne fournit pas seulement un trou à remplir - elle définit également le contenu qui remplit le trou dans le parent. S'il y avait deux balises {% block %} portant le même nom dans un modèle, le parent de ce modèle ne saurait pas lequel du contenu des blocs utiliser.

Les enfants ressemblent à ceci:

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

Si cela vous dérange, vous devez définir le titre de la vue pour chaque objet comme une variable de modèle. Django s'efforce de garder autant de logique que possible hors du calque de gabarit. Souvent, un titre est déterminé dynamiquement à partir de la base de données, de sorte que la couche de vue est l'endroit idéal pour récupérer et définir cette information. Vous pouvez toujours laisser le vide de titre si vous souhaitez reporter au titre par défaut (peut-être mis en base.html, ou vous pouvez saisir le nom du site de l'emballage django.contrib.sites)

également {{ block.super }} peut être utile. Cela vous permettra de combiner le contenu du bloc parent avec des contenus supplémentaires de l'enfant. Donc, vous pouvez définir un titre comme « Stackoverflow.com » dans la base, et mettre

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

chez l'enfant pour obtenir un titre comme « Stackoverflow.com - Poser une question »

1

Passez une variable à votre modèle, peut-être appelé titre. Remplacez ensuite votre cartouche par {{titre}}. Pour passer ce dernier dans votre modèle selon vous assurer que vous avez:

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

Ensuite, dans votre modèle, vous aurez:

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

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

Voir aussi: How to repeat a "block" in a django template

+0

Ce n'est pas ainsi que Django devrait être utilisé. –

+0

@Frank Crook: Vous voulez vous expliquer? –

+0

@csunwold: Je n'ai pas vraiment le temps, ou j'aurais juste répondu à la question. Pour être bref, la question vient de quelqu'un qui a une incompréhension fondamentale de la façon dont les blocs et l'héritage fonctionnent dans le système de templates de Django. Votre réponse ne clarifie pas cela pour eux, mais elle saute complètement sur le sujet des blocs et de l'héritage et montre un exemple où ils ne sont pas utilisés du tout. –

8
{% extends "base.html" %} 

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

Ce pourrait travailler si vous êtes vraiment inquiet de garder title hors de la vue et ne pas vous répéter.

20

En base.html:

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

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

Ensuite, faire une autre couche "de base" au-dessus de cette appelé content_base.html (ou quelque chose):

{% extends "base.html" %} 

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

ont maintenant tous vos autres modèles étendez content_base.html. Tout ce que vous mettez dans le bloc "title" dans tous vos templates ira dans les blocs "title" et "h1" dans base.html.

+0

Ouch, mais je suppose que ça va marcher. – mlissner