Använda allmänna vyer för att visa data
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:
- Läs in objektet från databasen med ID.
- Om objektet inte hittas returnerar du 404.
- 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 ListView
kan 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')