Django - Generische Ansichten

In einigen Fällen ist das Schreiben von Ansichten, wie wir zuvor gesehen haben, sehr schwer. Stellen Sie sich vor, Sie benötigen eine statische Seite oder eine Listenseite. Django bietet eine einfache Möglichkeit, diese einfachen Ansichten festzulegen, die als generische Ansichten bezeichnet werden.

Im Gegensatz zu klassischen Ansichten sind generische Ansichten Klassen und keine Funktionen. Django bietet eine Reihe von Klassen für generische Ansichten in django.views.generic an, und jede generische Ansicht ist eine dieser Klassen oder eine Klasse, die von einer von ihnen erbt.

Es gibt mehr als 10 generische Klassen -

>>> 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']

Dies können Sie für Ihre allgemeine Ansicht verwenden. Schauen wir uns ein Beispiel an, um zu sehen, wie es funktioniert.

Statische Seiten

Lassen Sie uns eine statische Seite aus der Vorlage "static.html" veröffentlichen.

Unsere static.html -

<html>
   <body> 
      This is a static page!!! 
   </body>
</html>

Wenn wir das so machen würden, wie wir es zuvor gelernt haben, müssten wir das ändern myapp/views.py sein -

from django.shortcuts import render

def static(request):
   return render(request, 'static.html', {})

und myapp/urls.py sein -

from django.conf.urls import patterns, url

urlpatterns = patterns("myapp.views", url(r'^static/', 'static', name = 'static'),)

Der beste Weg ist, generische Ansichten zu verwenden. Dafür wird unsere myapp / views.py -

from django.views.generic import TemplateView

class StaticView(TemplateView):
   template_name = "static.html"

Und unsere myapp / urls.py werden wir sein -

from myapp.views import StaticView
from django.conf.urls import patterns

urlpatterns = patterns("myapp.views", (r'^static/$', StaticView.as_view()),)

Beim Zugriff auf / myapp / static erhalten Sie -

Für das gleiche Ergebnis können wir auch Folgendes tun:

  • Keine Änderung in der views.py
  • Ändern Sie die Datei 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')),)

Wie Sie sehen, müssen Sie nur die Datei url.py in der zweiten Methode ändern.

Auflisten und Anzeigen von Daten aus der DB

Wir werden alle Einträge in unserem Dreamreal-Modell auflisten. Dies wird durch die Verwendung der generischen ViewView-Ansichtsklasse vereinfacht. Bearbeiten Sie die Datei url.py und aktualisieren Sie sie als -

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")),
)

An dieser Stelle ist zu beachten, dass die Variable, die von der generischen Ansicht an die Vorlage übergeben wird, object_list ist. Wenn Sie es selbst benennen möchten, müssen Sie der Methode as_view ein Argument context_object_name hinzufügen. Dann wird die url.py -

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” ,)

Die zugehörige Vorlage lautet dann -

{% extends "main_template.html" %}
{% block content %}
Dreamreals:<p>
{% for dr in object_list %}
{{dr.name}}</p>
{% endfor %}
{% endblock %}

Wenn Sie auf / myapp / dreamreals / zugreifen, wird die folgende Seite angezeigt: