Använda allmänna vyer för att visa data

Slutförd

Det allmänna visningssystemet i Django effektiviserar skapandet av repetitiv kod. De vanliga åtgärder som du utför i ett datadrivet program har samma mönster. Om du till exempel vill visa ett enskilt objekt med dess ID eller primärnyckel är arbetsflödet alltid:

  1. Läs in objektet från databasen med ID.
  2. Om objektet inte hittas returnerar du 404.
  3. Om objektet hittas skickar du objektet till en mall för visning.

Det allmänna vysystemet bekräftar detta faktum och tillhandahåller klasser som du kan använda som innehåller den kärnkod som redan har skrivits. Du ärver från lämplig klass, anger ett par egenskaper och registrerar sedan en lämplig sökväg i din URLconf. Resten tas om hand för dig!

Django innehåller två allmänna vyer för att visa data: DetailView och ListView.

DetailView för objektinformation

Den allmänna vyn DetailView används för att visa en detaljsida för ett objekt. DetailView hämtar objektet för den som anges model av primärnyckeln och skickar det till mallen. Du kan ange template_name namnet på mallen som ska användas. Standardvärdet är <model>_detail.html. Slutligen kan vi ange context_object_name namnet på variabeln som vi vill använda i mallen.

Om du vill skapa en detaljvy med hjälp av den allmänna vyn för en hund kan du använda följande kod:

from . import models
from django.views import generic

class DogDetailView(generic.DetailView):
    model = models.Dog
    template_name = 'dog_detail.html'
    context_object_name = 'dog'

DogDetailView Registreringen liknar alla andra path inmatningar. Det viktigaste för att säkerställa att du inkluderar är en parameter med namnet pk. Django använder den här konventionen för att identifiera den primära nyckeln. Du kommer också att notera att vi använder as_view() metoden för att konvertera klassen till en vy.

path('dog/<int:pk>', views.DogDetailView.as_view(), name='dog_detail')

ListView för en lista över objekt

Den generiska vyn ListView beter sig på ett liknande sätt som DetailView. Du kan ange context_object_name namnet på variabeln i vyn och template_name för namnet på mallen.

Den primära skillnaden är att ListView den är utformad för att fungera med alla former av en fråga som returnerar flera objekt. Därför måste du åsidosätta get_queryset funktionen. Funktionenget_queryset anropas av det allmänna visningssystemet för att hämta objekten från databasen, vilket gör att du kan beställa eller filtrera dina objekt efter behov.

Om du vill skapa en vy för att visa listan över alla skyddsrum med hjälp av den allmänna vyn ListViewkan du använda följande kod:

from . import models
from django.views import generic

class ShelterListView(generic.ListView):
    template_name = 'shelter_list.html'
    context_object_name = 'shelters'

    def get_queryset(self):
        return models.Shelter.objects.all()

Registrering av vyn utförs mycket på samma sätt som vår DetailView.

path('', ShelterListView.as_view(), name='shelter_list')