Les vues - views.py

Les views

C'est le dernier point de notre modèle MTV, il s'agit de faire le lien entre les modèles et les templates.

On peut les faire à l'aide de simple fonction qui prenne au minimum une request comme argument et retourne un HttpResponse:

from django.http import HttpResponse

def index(request):
    return HttpResponse('<h1>Hello world</h1>')

L'objet request

Il contient les informations renvoyée par WSGI plus certaines déjà préparées :

  • request.method le verbe HTTP utilisé pour atteindre la page
  • request.GET un dictionnaire avec le querystring
  • request.POST les données envoyées en POST
  • request.FILES les informations sur les fichiers lors de l'upload de fichiers

Plus d'infos ici : https://docs.djangoproject.com/en/dev/ref/request-response/#httprequest-objects

Les vues génériques

Les class-based views ont fait leur apparition avec Django 1.3.

Ça permet de considérer plus facilement une vue comme une ressource HTTP car c'est le verbe HTTP qui définie la méthode qui sera appellée.

De plus elles utilisent l'héritage multiple de Django pour mettre ensemble des mixins et faire très simplement les actions souhaités en en écrivant le moins possible.

C'est très DRY

On a déjà parlé des ListView, CreateView, TemplateView dans le TP précédent.

Pour plus d'informations : https://docs.djangoproject.com/en/dev/ref/class-based-views/

Les urls

On ne peut pas parler des views sans parler des urls.

En effet on va pouvoir "brancher" une vue sur une ou plusieurs urls.

Pour cela on définit un urlpattern dans le fichier urls.py :

# -*- coding: utf-8 -*-
from django.views.generic import TemplateView

urlpatterns = patterns('',
    url(r'^$', 'person.views.index'),
    url(r'^profile/$', TemplateView.as_view(template_name='profile.html')),
)

Ici on utilise la fonction définie ci-dessus pour la page d'accueil et pour la page profile, la TemplateView qui va simplement charger le template profile.html.

Urls et Expression Régulières

En fait ce que je ne vous dis pas, c'est que les urls c'est très puissant.

On peut définir des expressions régulières pour passer des arguments à notre vue.

Par exemple, si je veux afficher le profil d'une personne avec cette vue :

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})

Et ce template

{% extends "base.html" %}

{% block content %}
  <p><strong>{{ me.name }}</strong> a <em>{{ me.age }} ans</em>.</p>
  <p>Cette personne est née le <em>{{ me.dob|date:'d/m/Y' }}</em>.</p>
{% endblock %}

Et bien je vais pouvoir créer cette URL :

# -*- coding: utf-8 -*-
from django.views.generic import TemplateView

urlpatterns = patterns('',
    url(r'^profile/(?P<person_id>\d+)/$', 'person.views.profile'),
)
  • \d+ veut dire qu'on attends plusieurs entiers à cet endroit.
  • (?P<person_id>d+) veut dire que cette valeur sera passé comme person_id à la view.

On peut aussi passer l'information sous cette forme :

# -*- coding: utf-8 -*-
from django.views.generic import TemplateView

urlpatterns = patterns('',
    url(r'^profile/(?P<person_id>\d+)/$', 'person.views.profile'),
    url(r'^remy/$', 'person.views.profile', {'person_id': 1}),
)

Ainsi, l'URL http://servername/remy/ affichera le profil de la fiche numéro 1 tandis qu'avec l'autre URL on utilisera : http://servername/profile/1/

Conclusion

Voici ce qu'il fallait savoir sur les views et les urls.

Comments !

blogroll

social