Les templates - templates/¶
date: | 2012-05-01 19:12 |
---|---|
tags: | django, python |
category: | Django |
author: | Rémy Hubscher |
Un système hiérarchique¶
Vous faites du web, donc vous avez déjà du découper un design.
La première chose que l’on constate c’est que le graphisme reste quasiment le même d’une page à l’autre et il n’y a finalement que le bloc de contenu qui change et le menu sélectionné dans la barre de navigation.
Les templates de Django parte de ce postulat pour nous proposer un système extensible.
Pour mettre en place ses templates Django, nous allons donc créer le template de base, souvent appelé base.html.
Il va définir la structure de notre design puis nous allons l’étendre pour chaque page différente.
Les blocs¶
Les parties que nous souhaitons pouvoir surcharger sont appelé des blocks.
Voici un template de base :
{# Minimum HTML5 template #}
<!DOCTYPE html>
<html lang="fr">
<head>
{% block head %}
<title>{{ PAGE_TITLE }} - {{ WEBSITE_TITLE }}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
{% block head-medias %}{% endblock %}
{% endblock %}
</head>
<body>
{% block body %}
<!-- Header -->
<header>
{% block header %}
<h1>Tuto Django</h1>
{% endblock %}
</header>
<!-- End of Header -->
<!-- Navigation -->
<nav>
{% block navigation %}
<ul>
<li><a href="#">Accueil</a></li>
<li><a href="#">Mon portfolio</a></li>
<li><a href="#">Contact</a></li>
</ul>
{% endblock %}
</nav>
<!-- End of Navigation -->
<!-- Content -->
<section id="main-content">
{% block content %}{% endblock %}
</section>
<!-- End of Content -->
<!-- Footer -->
<footer>
{% block footer %}
<p>© 2012 - Rémy HUBSCHER</p>
{% endblock %}
</footer>
<!-- End of Footer -->
{% endblock %}
{% block extra-medias %}{% endblock %}
</body>
</html>
Bon effectivement il ne fait pas grand chose mais on a définit un certain nombre de block.
L’héritage¶
Pour étender du template de base et surcharger le contenu, on peut faire :
{% extends "base.html" %}
{% block content %}
<h1>Bienvenue sur mon site internet</h1>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Phasellus risus dolor, porttitor in laoreet non, posuere at
mi. Nullam ultricies congue nunc, et accumsan ipsum pharetra
non. Quisque vitae metus orci. Sed consequat condimentum ligula eu
volutpat. Nulla facilisi. Suspendisse ac viverra elit. Mauris eget
felis nec nisi cursus aliquet. Nulla facilisi.
</p>
<p>
Vivamus quis nunc nibh. Mauris diam tellus, tincidunt quis adipiscing
eleifend, auctor vel tortor. Vivamus fermentum ipsum quis ligula
ornare et dictum mi suscipit. Praesent malesuada scelerisque sapien
quis congue. Aenean leo turpis, consequat at pulvinar eu, dignissim id
sapien. Nullam sit amet neque tortor, et interdum ipsum. Pellentesque
porttitor sollicitudin diam quis lacinia. Vestibulum pharetra dictum
arcu, nec cursus diam pretium ut. Nullam ultrices congue elit ac
vulputate. Curabitur iaculis massa commodo elit viverra ornare. Nullam
bibendum augue a nisi lobortis ornare. Donec lobortis, magna ut
elementum eleifend, dolor justo aliquet quam, vitae ornare ipsum augue
sed massa.
</p>
{% endblock %}
Le tag extends doit être seul sur la première ligne du fichier de template.
Le context¶
Dans notre vue, on va passer un context de rendu au template.
Ce sont des variables qui seront disponible dans notre template
En passant ce context :
{'PAGE_TITLE': 'Accueil',
'WEBSITE_TITLE': 'Tuto Django'}
Les variables seront remplacé dans mon template.
Pour afficher une variable on utilise :
{{ PAGE_TITLE }}
Avec PAGE_TITLE le nom de la variable que l’on souhaite afficher.
On a aussi accès au champ des objets avec . :
{{ me.age }}
Pour afficher l’âge de la person me, il faudra passer l’objet Person en question au context:
from django.shortcuts import render_to_response, get_object_or_404
from person.models import Person
def profile(request, person_id):
me = get_object_or_404(Person, pk=person_id)
return render_to_response('person/profile.html', {'me': me})
get_object_or_404 permet de sécuriser l’accès à ma view en récupèrant l’objet ou en disant qu’il n’existe pas (erreur 404).
render_to_response permet de donner le nom du template et le context associé puis de retourner directement la réponse au format html.
Les tags et les filters¶
Puisqu’on vient de parler du tag extends il y a les tags et les filters qui permette de jouer sur le rendu de la page.
Tout est là : https://docs.djangoproject.com/en/dev/ref/templates/builtins/
Rien de bien compliqué :
Les tags¶
En deux parties :
{% autoescape on %}
{{ body }}
{% endautoescape %}
Il y a le nom de la commande entre {% commande %} et pour fermer {% endcommande %}
En une partie :
{% csrf_token %}
Il n’y a pas de commande fermante.
Les filters¶
Il se collent à une variable et on peut les chaîner pour modifier l’affichage de cette dernière :
{{ me.dob|date:'l d F Y- H:i' }}
{{ me.name|wordcount }}
Conclusion¶
C’est assez complet, je vous invite à lire la doc, mais rien de bien compliqué en soit si on a compris ces quelques points.
Bonus : django-sekizai¶
Si vous avez à gérer des templates compliqués avec de la gestion d’inclusion multiples de fichiers css et js, alors il faut jeter un œil à django-sekizai