From 4dfe1062f64a85f78b643d677d2a92f9c8bd4b85 Mon Sep 17 00:00:00 2001 From: Fred Date: Mon, 21 Dec 2015 21:43:55 +0100 Subject: [PATCH] templates --- source/views.rst | 4 +- source/views/my-first-wishlists.png | Bin 0 -> 21410 bytes source/views/templates.rst | 71 ++++++++++++++ source/views/views.rst | 146 ++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 source/views/my-first-wishlists.png create mode 100644 source/views/templates.rst create mode 100644 source/views/views.rst diff --git a/source/views.rst b/source/views.rst index 7cff945..b96ef93 100644 --- a/source/views.rst +++ b/source/views.rst @@ -3,6 +3,8 @@ Contrôleurs =========== Dans un *pattern* MVC classique, la traduction immédiate du **contrôleur** est une **vue**. Et comme on le verra par la suite, la **vue** est en fait le **template**. -Les vues agrègent donc les informations à partir d'un des composants et les font transiter vers un autre. En d'autres mots, la vue sert de pont entre deux composants. +Les vues agrègent donc les informations à partir d'un des composants et les font transiter vers un autre. En d'autres mots, la vue sert de pont entre les données gérées par la base et l'interface utilisateur. +.. include:: views/templates.rst +.. include:: views/views.rst .. include:: views/urls.rst diff --git a/source/views/my-first-wishlists.png b/source/views/my-first-wishlists.png new file mode 100644 index 0000000000000000000000000000000000000000..eacd331cec5f5577c54cd67769e69f3a2d73b474 GIT binary patch literal 21410 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 + + + + + + + +

Hello world!

+ + + +Notre première vue permettra de récupérer la liste des objets de type ``Wishlist`` que nous avons définis dans le fichier ``wish/models.py``. Supposez que cette liste soit accessible *via* la clé ``wishlists`` d'un dictionnaire passé au template. Elle devient dès lors accessible grâce aux tags ``{% for wishlist in wishlists %}``. A chaque tour de boucle, on pourra directement accéder à la variable ``{{ wishlist }}``. De même, il sera possible d'accéder aux propriétés de cette objet de la même manière: ``{{ wishlist.id }}``, ``{{ wishlist.description }}``, ... et d'ainsi respecter la mise en page que nous souhaitons. + +En reprenant l'exemple de la page HTML définie ci-dessus, on pourra l'agrémenter de la manière suivante: + +.. code-block:: html + + + + + + + + + +

Mes listes de souhaits

+
    + {% for wishlist in wishlists %} +
  • {{ wishlist.name }}: {{ wishlist.description }}
  • + {% endfor %} +
+ + + + +Vous pouvez déjà copié ce contenu dans un fichier ``templates/wsh/list.html``, on en aura besoin par la suite. + +Structure et configuration +========================== + +Il est conseillé que les templates respectent la structure de vos différentes applications, mais dans un répertoire à part. Par convention, nous les placerons dans un répertoire ``templates``. La hiérarchie des fichiers devient alors celle-ci: + +.. code--block:: bash + + $ tree templates/ + templates/ + └── wish + └── list.html + +Par défaut, Django cherchera les templates dans les répertoirer d'installation. Vous devrez vous éditer le fichier ``gwift/settings.py`` et ajouter, dans la variable ``TEMPLATES``, la clé ``DIRS`` de la manière suivante: + +.. code-block:: python + + TEMPLATES = [ + { + ... + 'DIRS': [ 'templates' ], + ... + }, + ] diff --git a/source/views/views.rst b/source/views/views.rst new file mode 100644 index 0000000..0dc522f --- /dev/null +++ b/source/views/views.rst @@ -0,0 +1,146 @@ +**** +Vues +**** + +Une vue correspond à un contrôleur dans le pattern MVC. Tout ce que vous pourrez définir au niveau du fichier ``views.py`` fera le lien entre le modèle stocké dans la base de données et ce avec quoi l'utilisateur pourra réellement interagir (le ``template``). + +Chaque vue peut etre représentée de deux manières: soit par des fonctions, soit par des classes. Le comportement leur est propre, mais le résultat reste identique. Le lien entre l'URL à laquelle l'utilisateur accède et son exécution est faite au travers du fichier ``gwift/urls.py``, comme on le verra par la suite. + +Function Based Views +==================== + +Les fonctions (ou ``FBV`` pour *Function Based Views*) permettent une implémentation classique des contrôleurs. Au fur et à mesure de votre implémentation, on se rendra compte qu'il y a beaucoup de répétitions dans ce type d'implémentation: elles ne sont pas obsolètes, mais dans certains cas, il sera préférable de passer par les classes. + +Pour définir la liste des ``WishLists`` actuellement disponibles, on précédera de la manière suivante: + + 1. Définition d'une fonction qui va récupérer les objets de type ``WishList`` dans notre base de données. La valeur de retour sera la construction d'un dictionnaire (le *contexte*) qui sera passé à un template HTML. On démandera à ce template d'effectuer le rendu au travers de la fonction ``render``, qui est importée par défaut dans le fichier ``views.py``. + 2. Construction d'une URL qui permettra de lier l'adresse à l'exécution de la fonction. + 3. Définition du squelette. + +Définition de la fonction +------------------------- + +.. code-block:: python + + # wish/views.py + + from django.shortcuts import render + from .models import Wishlist + + def wishlists(request): + w = Wishlist.objects.all() + return render(request, 'wish/list.html',{ 'wishlists': w }) + +Construction de l'URL +--------------------- + +.. code-block:: python + + # gwift/urls.py + + from django.conf.urls import include, url + from django.contrib import admin + + from wish import views as wish_views + + urlpatterns = [ + url(r'^admin/', include(admin.site.urls)), + url(r'^$', wish_views.wishlists, name='wishlists'), + ] + +Définition du squelette +----------------------- + +A ce stade, vérifiez que la variable ``TEMPLATES`` est correctement initialisée dans le fichier ``gwift/settings.py`` et que le fichier ``templates/wish/list.html`` ressemble à ceci: + +.. code-block:: html + + + + + + + + + +

Mes listes de souhaits

+
    + {% for wishlist in wishlists %} +
  • {{ wishlist.name }}: {{ wishlist.description }}
  • + {% endfor %} +
+ + + +Exécution +--------- + +A présent, ajoutez quelques listes de souhaits grâce à un *shell*, puis lancez le serveur: + +.. code-block:: shell + + $ python manage.py shell + >>> from wish.models import Wishlist + >>> Wishlist.create('Décembre', "Ma liste pour les fêtes de fin d'année") + + >>> Wishlist.create('Anniv 30 ans', "Je suis vieux! Faites des dons!") + + +Lancez le serveur grâce à la commande ``python manage.py runserver``, ouvrez un navigateur quelconque et rendez-vous à l'adresse `http://localhost:8000 `_. Vous devriez obtenir le résultat suivant: + +.. image:: views/my-first-wishlists.png + :align: center + +Rien de très sexy, aucune interaction avec l'utilisateur, très peu d'utilisation des variables contextuelles, mais c'est un bon début! =) + +Class Based Views +================= + +Les classes, de leur côté, implémente le *pattern* objet et permettent d'arriver facilement à un résultat en très peu de temps, parfois même en définissant simplement quelques attributs, et rien d'autre. Pour l'exemple, je vais définir deux classes qui donnent exactement le même résultat que la fonction ``wishlists`` ci-dessus. Une première fois en utilisant une classe générique vierge, et ensuite en utilisant une classe de type ``ListView``. + +Classe générique +---------------- + +blah + +ListView +-------- + +Les classes génériques implémentent un aspect bien particulier de la représentation d'un modèle, en utilisant très peu d'attributs. Les principales classes génériques sont de type ``ListView``, [...]. L'implémentation consiste, exactement comme pour les fonctions, à: + + 1. Définir la classe + 2. Créer l'URL + 3. Définir le squelette. + +.. code-block:: python + + # wish/views.py + + from django.views.generic import ListView + + from .models import Wishlist + + class WishListList(ListView): + context_object_name = 'wishlists' + model = Wishlist + template_name = 'wish/list.html' + + +.. code-block:: python + + # gwift/urls.py + + from django.conf.urls import include, url + from django.contrib import admin + + from wish.views import WishListList + + urlpatterns = [ + url(r'^admin/', include(admin.site.urls)), + url(r'^$', WishListList.as_view(), name='wishlists'), + ] + +C'est tout. Lancez le serveur, le résultat sera identique. Par inférence, Django construit beaucoup d'informations: si on n'avait pas spécifié les variables ``context_object_name`` et ``template_name``, celles-ci auraient pris les valeurs suivantes: + + * ``context_object_name``: ``wishlist_list`` (ou plus précisément, le nom du modèle suivi de ``_list``) + * ``template_name``: ``wish/wishlist_list.html`` (à nouveau, le fichier généré est préfixé du nom du modèle).