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

Slutförd

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.

  1. Användaren skickar en GET-begäran för att signalera att de vill att formuläret ska skapa ett nytt objekt.
  2. Servern skickar formuläret med en särskild token för att förhindra förfalskning av begäranden mellan webbplatser (CSRF).
  3. 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.
  4. Servern validerar CSRF-token för att säkerställa att ingen manipulering har ägt rum.
  5. Servern validerar all information för att säkerställa att den uppfyller reglerna. Ett felmeddelande returneras om verifieringen misslyckas.
  6. Servern försöker spara objektet i databasen. Om det misslyckas returneras ett felmeddelande till användaren.
  7. 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, UpdateViewoch 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 reverseav . 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 pkav . Till skillnad från UpdateViewbehö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_lazyav .

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ällningen method 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>