Django : Utiliser les vues (controllers?) génériques

Je peux me tromper (oui on fait tous des erreurs) mais c’est un concept que je ne connais pas avec PHP. Vous vous êtes probablement déjà retrouvé dans cette situation désastreuse en développant un API REST. Oui, je parle de toutes les méthodes dans ces controllers qui se ressemblent, et que vous avez quand même du écrire dans les 30 controllers de votre application, pour les 30 ressources différentes.

créer formulaire python

Django, me maître d’œuvre

Et bien il semble que Django ai pensé à vous (si vous n’avez pas solutionné le problème de votre côté, entendons-nous bien : DRY) : Les vues génériques sont donc des méthodes qui permettent d’ajouter de l’abstraction dans vos vues (vos controllers ? Ca va rentrer, ami codeur PHP) et vous éviter de répéter encore et encore le même schéma.

Le fichier urls.conf

Voici le nouveau fichier urls.conf de votre app polls :


urlpatterns = [
#AVANT
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P[0-9]+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P[0-9]+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P[0-9]+)/vote/$', views.vote, name='vote'),

#APRES
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P[0-9]+)/$', views.DetailView.as_view(), name='detail'),
url(r'^(?P[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
url(r'^(?P[0-9]+)/vote/$', views.vote, name='vote'),
]

Notez l’usage de views.NomGeneriqueView,.as_view() et de . Ce pk doit correspondre à la clé primaire de votre ressource (Question, etc).

Le fichier views.py


from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views import generic

from .models import Choice, Question


class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_question_list'

    def get_queryset(self):
        """Return the last five published questions."""
        return Question.objects.order_by('-pub_date')[:5]


class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'


class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'

On y retrouve les différentes méthodes qu’on a écrits dans le fichier de routes, mais on ne sait toujours pas comment ça marche. Ça vous énerve ? Moi aussi. En fait, toute la magie opère quand on injecte genrique.DetailView (par exemple).

Les explications

Déjà, c’est confirmé. <pk> correspond bien à la clé primaire. Maintenant, ce qu’il faut comprendre, c’est qu’une vue générique a besoin de ce paramètre, mais aussi d’une variable model, et du nom du template. Si toi aussi t’es un adepte des conventions, si aucune variable template_name n’est défini, par défaut, si la vue générique s’appelle DetailView, il va faire ceci comme un grand : <app name>/<model name>_detail.html. Plutôt cool hein ?

Il existe une quantité de vue génériques déjà présentes dans Django. En fouillant dans le code, on peut avoir cette liste :

‘View’, ‘TemplateView’, ‘RedirectView’, ‘ArchiveIndexView’,
‘YearArchiveView’, ‘MonthArchiveView’, ‘WeekArchiveView’, ‘DayArchiveView’,
‘TodayArchiveView’, ‘DateDetailView’, ‘DetailView’, ‘FormView’,
‘CreateView’, ‘UpdateView’, ‘DeleteView’, ‘ListView’, ‘GenericViewError’,

Ca demande vraiment à être approfondit, mais ça fait gagner un temps considérable, que vous allez pouvoir utiliser en procrastinant, une fois que vous maîtriserez cet aspect.

metrogeek

Laisser un commentaire