Använda allmänna vyer för att redigera data
Precis som den kod som krävs för att visa data är koden som tillåter användare att ändra data repetitiv. Det kan också vara tråkigt eftersom flera steg krävs för att säkerställa att data är giltiga och skickas korrekt. Lyckligtvis kan det allmänna visningssystemet effektivisera mängden kod som vi behöver för att aktivera den här funktionen.
Skapa nya objekt
Innan vi utforskar hur Django kan effektivisera vår utveckling bör vi granska processen som gör det möjligt för användare att ändra data. Nu ska vi utforska arbetsflödet som servern använder för att hantera processen med att skapa ett nytt objekt eller ett nytt datastycke och arbetet med att skapa HTML-formuläret.
Arbetsflöde för skapande
På ytan kan koden som gör det möjligt för en användare att skapa ett objekt verka trivial. Det visar sig att det är en bedrägligt involverad process.
- Användaren skickar en GET-begäran för att signalera att de vill att formuläret ska skapa ett nytt objekt.
- Servern skickar formuläret med en särskild token för att förhindra förfalskning av begäranden mellan webbplatser (CSRF).
- Användaren fyller i formuläret och väljer skicka, vilket skickar en POST-begäran för att ange att formuläret har slutförts.
- Servern validerar CSRF-token för att säkerställa att ingen manipulering har ägt rum.
- Servern validerar all information för att säkerställa att den uppfyller reglerna. Ett felmeddelande returneras om verifieringen misslyckas.
- Servern försöker spara objektet i databasen. Om det misslyckas returneras ett felmeddelande till användaren.
- När det nya objektet har sparats omdirigerar servern användaren till en lyckad sida.
Den här processen kräver en hel del kod! Det mesta av det är pannplåt, vilket innebär att det är samma varje gång du skapar det.
Formulär
Att skapa ett HTML-formulär kan vara en omständlig process. Utvecklare kopierar och klistrar input
ofta in taggar, loopar igenom listor för att skapa listrutor och konfigurerar alternativknappar. När modellen ändras måste formuläret uppdateras.
Du kanske har märkt att modellerna vi skapar i Django innehåller allt som behövs för att skapa formuläret. När vi lade till de olika fälten angav vi datatyperna, som är kopplade till olika HTML-element. Ett booleskt fält skulle till exempel vara en kryssruta och en sekundärnyckel skulle vanligtvis vara en listruta.
Allmänna vyer för att ändra data
Ett av Djangos viktigaste mål är att eliminera behovet av att ständigt återskapa samma kodblock om och om igen. För att stödja det här målet för dataändringar tillhandahåller Django en samling generiska klasser och formulär för att hantera den här arbetsbelastningen åt oss. Som vi ser innehåller den all nödvändig kod och kan även skapa formuläret för oss dynamiskt. De klasser som används för att skapa, uppdatera och ta bort data kallas CreateView
, UpdateView
och DeleteView
.
CreateView
Klassen CreateView
används för att tillåta att en användare skapar objekt. Den går igenom föregående process och skapar formuläret dynamiskt. När det har lyckats visas informationssidan för det nyligen skapade objektet.
Du anger model
och template_name
vill associera med den precis som med de andra allmänna vyerna. Den viktigaste skillnaden för CreateView
är att inkludera en fields
egenskap där du listar de redigerbara fälten. Med den här egenskapen kan du se till att fält som inte ska redigeras, t.ex. ett skapandedatum, inte visas i formuläret. Vyn för att skapa en ny hund kan se ut som följande exempel:
from . import models
from django.views import generic
class DogCreateView(generic.CreateView):
model = models.Dog
template_name = 'dog_form.html'
fields = ['name', 'description', 'shelter']
UpdateView
Klassen UpdateView
beter sig på ett identiskt sätt med CreateView
. Den enda skillnaden är att det automatiskt läser in ett objekt baserat på parametern pk
. Django använder den här konventionen för primärnyckeln för ett objekt.
from . import models
from django.views import generic
class DogUpdateView(generic.CreateView):
model = models.Dog
template_name = 'dog_form.html'
fields = ['name', 'description', 'shelter']
När ett objekt har skapats eller uppdaterats omdirigeras Django till informationssidan för objektet. Den hämtar URL:en för informationen med hjälp get_absolute_url
av den associerade modellen. Du implementerar den här metoden genom att returnera rätt URL. Du kan hämta lämplig URL från URLconf med hjälp reverse
av . Obs! kwargs
används för att skicka parametern pk
eller primärnyckeln till vägen.
from django.db import models
# TODO: Import reverse
from django.urls import reverse
class Dog(models.Model):
# Existing code
def get_absolute_url(self):
return reverse('dog_detail', kwargs={"pk": self.pk})
DeleteView
Klassen DeleteView
liknar UpdateView
. Det gör att en användare kan ta bort ett objekt och identifierar objektet som ska tas bort med hjälp pk
av . Till skillnad från UpdateView
behövs fields
inte eftersom du kommer att ta bort hela objektet. Eftersom inget objekt har skapats eller uppdaterats nyligen måste vi också bestämma var vi vill omdirigera användaren. Vi kan skapa en omdirigering genom att ange success_url
rätt värde. Du kan söka efter en URL med hjälp reverse_lazy
av .
from . import models
from django.views import generic
from django.urls import reverse_lazy
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
Kommentar
Vi använder reverse_lazy
på grund av den ordning i vilken information läses in i Django.
Formulärmallar för att skapa och uppdatera
De allmänna vyerna kan skapa HTML-formuläret åt oss dynamiskt. Allt vi behöver ange är en mall som fungerar som platshållare för formuläret. Platshållarmallen ser till att formuläret matchar resten av webbplatsen. Som tur är behöver vi inte mycket kod för att skapa den.
De allmänna vyerna skapar automatiskt en form
variabel som mallen ska använda. Formulärelementen som tillhandahålls av Django kan visas inuti <p>
taggar eller som en <table>
.
Variabeln form
innehåller all lämplig HTML-kod för att skapa kontrollerna från formuläret. Den innehåller inte själva taggen <form>
eller en skicka-knapp . Vår mall måste innehålla fyra objekt:
- Elementet
form
med inställningenmethod
POST eftersom den här inställningen utlöser spara-åtgärden på servern. - Koden
{% csrf_token %}
för att lägga till CSRF-token för att förhindra förfalskning. - Koden
{{ form.as_p }}
eller{{ form.as_table }}
för att visa det dynamiskt genererade formuläret. - Knappen
submit
.
Följande kod kan fungera som värd för valfritt allmänt visningsformulär.
<form method="post">{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>