Django - Viste generiche
In alcuni casi, scrivere visualizzazioni, come abbiamo visto prima, è davvero pesante. Immagina di aver bisogno di una pagina statica o di una pagina di elenco. Django offre un modo semplice per impostare quelle viste semplici chiamate viste generiche.
A differenza delle viste classiche, le viste generiche sono classi e non funzioni. Django offre una serie di classi per viste generiche in django.views.generic e ogni vista generica è una di quelle classi o una classe che eredita da una di esse.
Esistono più di 10 classi generiche:
>>> 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']
Questo puoi usare per la tua visualizzazione generica. Diamo un'occhiata a qualche esempio per vedere come funziona.
Pagine statiche
Pubblichiamo una pagina statica dal modello "static.html".
Il nostro static.html -
<html>
<body>
This is a static page!!!
</body>
</html>
Se lo facessimo nel modo in cui abbiamo imparato prima, dovremmo cambiare il file myapp/views.py essere -
from django.shortcuts import render
def static(request):
return render(request, 'static.html', {})
e myapp/urls.py essere -
from django.conf.urls import patterns, url
urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)
Il modo migliore è utilizzare visualizzazioni generiche. Per questo, il nostro myapp / views.py diventerà -
from django.views.generic import TemplateView
class StaticView(TemplateView):
template_name = "static.html"
E il nostro myapp / urls.py saremo -
from myapp.views import StaticView
from django.conf.urls import patterns
urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)
Quando accedi a / myapp / static ottieni:
Per lo stesso risultato possiamo anche fare quanto segue:
- Nessun cambiamento nel views.py
- Cambia il file url.py in -
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')),)
Come puoi vedere, devi solo cambiare il file url.py nel secondo metodo.
Elenco e visualizzazione dei dati dal DB
Elencheremo tutte le voci nel nostro modello Dreamreal. Questa operazione è semplificata utilizzando la classe di visualizzazione generica ListView. Modifica il file url.py e aggiornalo come -
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")),
)
È importante notare a questo punto che la variabile passata dalla vista generica al modello è object_list. Se vuoi nominarlo tu stesso, dovrai aggiungere un argomento context_object_name al metodo as_view. Quindi url.py diventerà -
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” ,)
Il modello associato sarà quindi:
{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}
L'accesso a / myapp / dreamreals / produrrà la seguente pagina: