Django - Vues génériques
Dans certains cas, l'écriture de vues, comme nous l'avons vu précédemment, est très lourde. Imaginez que vous ayez besoin d'une page statique ou d'une page de liste. Django offre un moyen simple de définir ces vues simples appelées vues génériques.
Contrairement aux vues classiques, les vues génériques sont des classes et non des fonctions. Django propose un ensemble de classes pour les vues génériques dans django.views.generic, et chaque vue générique est l'une de ces classes ou une classe qui hérite de l'une d'entre elles.
Il existe plus de 10 classes génériques -
>>> import django.views.generic
>>> dir(django.views.generic)
['ArchiveIndexView', 'CreateView', 'DateDetailView', 'DayArchiveView',
'DeleteView', 'DetailView', 'FormView', 'GenericViewError', 'ListView',
'MonthArchiveView', 'RedirectView', 'TemplateView', 'TodayArchiveView',
'UpdateView', 'View', 'WeekArchiveView', 'YearArchiveView', '__builtins__',
'__doc__', '__file__', '__name__', '__package__', '__path__', 'base', 'dates',
'detail', 'edit', 'list']
Vous pouvez l'utiliser pour votre vue générique. Regardons un exemple pour voir comment cela fonctionne.
Pages statiques
Publions une page statique à partir du modèle «static.html».
Notre static.html -
<html>
<body>
This is a static page!!!
</body>
</html>
Si nous faisions cela comme nous l'avons appris auparavant, nous devrons changer le myapp/views.py être -
from django.shortcuts import render
def static(request):
return render(request, 'static.html', {})
et myapp/urls.py être -
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)
Le meilleur moyen est d'utiliser des vues génériques. Pour cela, notre myapp / views.py deviendra -
from django.views.generic import TemplateView
class StaticView(TemplateView):
template_name = "static.html"
Et notre myapp / urls.py nous serons -
from myapp.views import StaticView
from django.conf.urls import patterns
urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)
Lorsque vous accédez à / myapp / static, vous obtenez -
Pour le même résultat, nous pouvons également faire ce qui suit -
- Aucun changement dans le views.py
- Remplacez le fichier url.py par -
from django.views.generic import TemplateView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^static/',TemplateView.as_view(template_name = 'static.html')),)
Comme vous pouvez le voir, il vous suffit de modifier le fichier url.py dans la deuxième méthode.
Liste et affichage des données de la base de données
Nous allons lister toutes les entrées de notre modèle Dreamreal. Cela est facilité par l'utilisation de la classe de vue générique ListView. Modifiez le fichier url.py et mettez-le à jour comme -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns(
"myapp.views", url(r'^dreamreals/', ListView.as_view(model = Dreamreal,
template_name = "dreamreal_list.html")),
)
Il est important de noter à ce stade que la variable transmise par la vue générique au modèle est object_list. Si vous voulez le nommer vous-même, vous devrez ajouter un argument context_object_name à la méthode as_view. Ensuite, l'url.py deviendra -
from django.views.generic import ListView
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views",
url(r'^dreamreals/', ListView.as_view(
template_name = "dreamreal_list.html")),
model = Dreamreal, context_object_name = ”dreamreals_objects” ,)
Le modèle associé sera alors -
{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}
L'accès à / myapp / dreamreals / produira la page suivante -