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: