Mis a jour le 2025-04-14, 12:10

Création des views

Une vue (view) :
  • c'est une fonction python (ou une méthode) que l'on rajoute dans myApp/views.py (mais en fait, c'est une convention, on peut la mettre dans un fichier ayant n'importe quel nom).
  • elle est choisie grâce à un mapping entre l'URL et la view à utiliser.
  • si on a dans urls.py :
    from django.conf.urls import patterns, url
    from myApp import views
    urlpatterns = patterns('', url(r'^$', views.myFunc))
        
    alors, il faut rajouter la fonction myFunc dans views.py.
  • la fonction view est appelée avec un objet HttpRequest, ainsi que tous les arguments capturés par l'expression régulière :
    • soit des arguments par position si match sans nom.
    • soit des arguments par nom si match avec un nom (du genre (<myName>\d+) par exemple).
  • la fonction view doit renvoyer un objet HttpResponse ou lever une exception comme par exemple Http404.
  • on peut utiliser le système de template de Django pour la réponse, mais on n'est pas obligé.
Erreurs :
  • au lieu de renvoyer une HttpResponse, on peut aussi faire :
    from django.html import Http404
    def myFunc(request):
        ...
        raise Http404('my message')
        
    en fait, python catche l'erreur et renvoie une HttpResponseNotFound.
  • mais, le mieux est de créer un template qui doit s'appeler 404.html pour avoir une page d'erreur optimale, et :
    • il faut placer cette page dans la racine des templates (myProject/templates par exemple).
    • il faut que DEBUG soit à False.
Utilisation d'un template :
  • mettre le template myTemplate.html dans myApp/templates/myTemplate.html
  • pour utiliser le template, faire dans la fonction view :
    from django.template import RequestContext, loader
    # Construit les objets avec le modele
    myObjectList = MyModel.objects.all()
    template = loader.get_template('myTemplate.html')
    # associe les objets construits myObjectList au tag 'myObjectList'
    context = RequestContext(request, {'myObjectList': myObjectList})
    return HttpResponse(template.render(context))
        
On peut utiliser le raccourci suivant, render(), qui construit une réponse avec le template indiqué et les variables données dans le dictionnaire :
  • from django.shortcuts import render
    myObjectList = MyModel.objects.all()
    context = {'myObjectList': myObjectList}
    return render(request, 'myTemplate.html', context)
        
  • on peut donner aussi à render :
    • un content_type si on veut autre chose que DEFAULT_CONTENT_TYPE (qui vaut text/html par défaut).
    • un status, si on veut autre chose que 200 (= ok).
    • dirs : un tuple de directories pour aller chercher les templates, à utiliser à la place de TEMPLATE_DIRS.
raccourci redirect() :
  • permet de renvoyer un HttpResponseRedirect.
  • redirect(myObject) : la méthode get_absolute_url() de l'objet est appelée pour avoir l'url de redirection (utiliser la fonction reverse pour cela).
  • redirect('myUrlName', var1 = '1', var2 = 'b') : on donne ici un nom d'url avec ses paramètres associés
  • on peut rajouter permanent = True pour avoir une redirection permanente.
Lever une exception :
from django.http import Http404
raise Http404('Pas de Resultats')
  
Raccourci qui récupère un objet d'un modèle, mais lève une exception Http404 s'il n'existe pas :
  • from django.shortcuts import get_object_or_404, render
    myObj = get_object_or_404(MyModel, pk = 2)
    return render(request, 'myTemplate.html', {'myObj': myObj})
        
  • il y a aussi un myObjects = get_list_or_404(MyModel, col1 = 5) qui va chercher la liste des objets de la classe MyModel avec les critères indiqués, sous le format accepté par filter() : il est à ce que get_object_or_404(), ce que filter() est à get()). Il fait une exception Http404 si aucun objet trouvé.
Redirect :
  • renvoyer un objet HttpResponseRedirect au lieu d'un HttpResponse.
  • HttpResponseRedirect prend comme argument l'url vers laquelle on veut renvoyer.
  • c'est une bonne pratique de développement que de toujours faire un redirect après un post (indépendamment de Django) !
Decorators :
  • si on veut restreindre une view seulement aux posts, par exemple, faire :
    from django.views.decorators.http import require_http_methods
    @require_http_methods(['POST'])
    def myView(...):
        ...
        

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert