Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Les vues et les templates avec Django

Article posté le 29-09-2014 dans la catégorie Django

Attention, le contenu cet article est peut-être obsolète!

Suite de nos tutoriaux sur Django. Aujourd'hui les rudiments des vues et des templates!

1- Un exemple basique pour comprendre

Il y deux fichiers que vous devez traiter :

  1. Le fichier views.py se trouvant dans le dossier principal de votre installation de Django
  2. Le fichier urls.py se trouvant dans le module (donc le sous-dossier correspondant

Commencons avec un exemple tout bête. Il va nous servir à comprendre la base, mais ne travaillez pas comme cela, car en renvoyant du code HTML directement depuis la vue, vous casseriez quelque par le principe du framework et son découpage. Il vaut mieux passer par un template. Mais revenons à notre exemple.

Editez votre premier fichier :

#-*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
def home(request):
  text = """
<h1>Bienvenue sur mon album</h1>
<p>Plein d'images cool!</p>
  return HttpResponse(text)

Nous avons défini le codage en UTF-8 pour bien gérer les accents, puis nous avons créer une méthode qui va retourner une réponse contenant un peu de code HTML. A retenir : toutes les méthodes doivent prendre une request comme premier argument et doivent retourner une Http Response.

A présent, allons dans votre fichier urls.py.

from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
    # Examples:
    # url(r'^$', 'mes_images.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
    #Notre ajout :
    url(r'^$', 'images.views.home'),
]

Nous avons rajouté les deux dernières lignes. Concrètement, le premier paramètre de la fonction url est une expression régulière, et la deuxième la vue à appeler dans le cas où la requête correspond à l'expression régulière. Le ^ sert de début à l'expression, le $ de fin. Ici, vu qu'il n'y a rien entre les deux, nous définissons donc la page d'accueil.

Si nous avions mis : r'^ajout/$ , cela aurait voulu dire, "donne moi la vue pour l'url suivante : " http://www.monsite.com/ajout !

Détaillons à présent le second paramètre de la méthode url :

Maintenant, allez sur votre site : http://localhost:8000/ et contemplez le résultat.

2- Gérer ses routes proprement

Quand vous avez une grosse application utilisant plusieurs modules, il est recommandé de créer un fichier d'URL par module. Voici comment procéder :

Tout d'abord, dans votre module, créez un fichier urls.py. Ensuite, remplissez le avec votre route :

from django.conf.urls import patterns, url
urlpatterns = patterns('',
    url(r'^$', 'images.views.home'),
)

Vous gérez ainsi toutes vos url commenceant par images/ dans cet unique fichier!

Une deuxième étape consiste à éditer votre fichier urls.py général et y ajouter une règle d'importantation :

url(r'^images/', include('images.urls')),

Le tour est joué!

Un petit conseil : en cas de changement de nom de votre module, afin d'avoir à éviter de renommer toutes vos routes, voic une astuce : changez le contenu du pattern pour n'avoir à préciser le nom du module qu'une seule fois en tête de la règle :

urlpatterns = patterns('images.views',
    url(r'^$', 'home'),
)

C'est mieux!

3- Passer des arguments aux vues

Pour récuperer des informations dans une vue, depuis l'url, il faut travailler dans le fichier URL, et dans le vue bien évidemment. Imaginons ici que vous souhaitiez voir une image, voici d'abord l'url 

url(r'^images/(d+)/$', 'view_image'),

Vous avez compris, tout se fait par des expressions régulières. Et à droite, on spécifie la vue que l'on souhaite appeler. Maintenant, regardons la vue, vous verrez qu'il y a un paramètre supplémentaire : l'identifiant de notre image :

def view_image(request, id_image):
    """ Dans notre exemple, vue qui affiche une image selon son identifiant numérique. Son Id est donc le second paramètre de la fonction"""
   
    text = "Vous avez demandé à voir l'image n°{0} !".format(id_image)
    return HttpResponse(text)

Information importante : si vous utilisez plusieurs paramètres, ils doivent être mis dans l'ordre qu'ils apparaissent dand l'URL! Cependant, vous pouvez éviter cet éventuel casse-tête en assignant un nom de variable, dans la route :

url(r'^images/(?Pd+)/$', 'view_image'),

Dans la vue à présent :

def view_image(request, id_image):
    text = "Vous avez demandé à voir l'image n°{0} !".format(id_image)
    return HttpResponse(text)

Je vous laisse découvrir la documentation pour toutes les possibilités que cela offre...

4- Créer du template...

Moi j'aimerai me créer un template global dans lequel viendrait s'intégrer divers éléments. Je vais ainsi créer un fichier layout.html dans le dossier tempates à la racine du projet.

Retenez qu'il contiendra deux blocs à "alimenter" à chaque fois : le bloc title et le bloc content.

{% load staticfiles %}
<!DOCTYPE html>
<html lang="fr">
<head>
   <title>{% block title %}{% endblock %}</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <meta name="robots" content="noindex,nofollow" />
    <link href="{% static 'style/style.css' %}" rel="stylesheet" type="text/css">
</head>
<body>
<header>Mes Images</header>
    <nav>
       {% block nav %}
       <ul>
           <li><a href="/">Accueil</a></li>
           <li><a href="/images/">Liste des images</a></li>
       </ul>
       {% endblock %}
   </nav>
   <section id="content">
       {% block content %}{% endblock %}
   </section>
<footer>© Courtialet Images</footer>
</body>
</html>

A présent, si je souhaite y intégrer un template en particulier, je dois faire hériter ce dernier de mon layout.html, et fournir les blocs :

{% extends "layout.html" %}
{% block title %}Les images du site{% endblock %}
{% block content %}
    <h1>Les images du site</h1>
    <p>Liste.</p>
{% endblock %}

Voilà pour l'essentiel


Cet article vous a plu? Découvrez d'autres articles


Tweet
comments powered by Disqus