Použití obecných zobrazení k úpravě dat
Stejně jako kód potřebný k zobrazení dat se kód umožňující uživatelům upravovat data opakuje. Může to být také zdlouhavé, protože k zajištění správnosti a odeslání dat je potřeba několik kroků. Systém obecného zobrazení naštěstí může zjednodušit množství kódu, který potřebujeme k povolení této funkce.
Vytvoření nových položek
Než prozkoumáme, jak může Django zjednodušit vývoj, měli bychom zkontrolovat proces, který uživatelům umožňuje upravovat data. Pojďme se podívat na pracovní postup, který server používá ke správě procesu vytváření nové položky nebo části dat a práce, která přechází do vytváření formuláře HTML.
Pracovní postup vytvoření
Na povrchu může být kód, který uživateli umožní vytvořit položku, triviální. Jak se ukázalo, jedná se o podvodný proces.
- Uživatel odešle požadavek GET , aby signalizoval, že formulář chce vytvořit novou položku.
- Server odešle formulář se speciálním tokenem, aby se zabránilo padělání žádostí mezi weby (CSRF).
- Uživatel dokončí formulář a vybere odeslání, které odešle žádost POST s informací, že formulář byl dokončen.
- Server ověří token CSRF, aby se zajistilo, že nedošlo k manipulaci.
- Server ověří všechny informace, aby zajistil, že splňuje pravidla. Pokud se ověření nezdaří, vrátí se chybová zpráva.
- Server se pokusí uložit položku do databáze. Pokud selže, uživateli se vrátí chybová zpráva.
- Po úspěšném uložení nové položky server přesměruje uživatele na stránku úspěchu.
Tento proces vyžaduje poměrně málo kódu! Většina z nich se používá, což znamená, že je stejná pokaždé, když ji vytvoříte.
Formuláře
Vytvoření formuláře HTML může být zdlouhavý proces. Vývojáři často kopírují a vkládají input
značky, cyklicky procházejí seznamy a vytvářejí rozevírací seznamy a nastavují přepínače. Pokaždé, když se model změní, musí být formulář aktualizován.
Možná jste si všimli, že modely, které vytvoříme v Django, obsahují vše potřebné k vytvoření formuláře. Po přidání různých polí jsme označili datové typy, které jsou svázány s různými prvky HTML. Například logické pole by bylo zaškrtávací políčko a cizí klíč by obvykle byl rozevírací seznam.
Obecná zobrazení pro úpravy dat
Jedním z klíčových cílů Django je eliminovat nutnost neustále znovu vytvářet stejné bloky kódu. Pro podporu tohoto cíle pro úpravy dat poskytuje Django kolekci obecných tříd a formulářů pro správu této úlohy. Jak uvidíme, obsahuje veškerý potřebný kód a může dokonce vytvořit formulář pro nás dynamicky. Třídy používané k vytváření, aktualizaci a odstraňování dat se nazývají CreateView
, UpdateView
a DeleteView
.
CreateView
Třída CreateView
se používá k tomu, aby uživatel mohl vytvářet položky. Provede předchozí proces a dynamicky vytvoří formulář. Po úspěšném dokončení se zobrazí stránka podrobností pro nově vytvořenou položku.
Zadáte model
a template_name
chcete ho přidružit stejně jako k ostatním obecným zobrazením. Klíčovým rozdílem pro CreateView
je zahrnutí vlastnosti, ve které vypíšete fields
upravitelná pole. Pomocí této vlastnosti můžete zajistit, aby se pole, která by se neměla upravovat, třeba datum vytvoření, se ve formuláři nezobrazují. Zobrazení pro vytvoření nového psa může vypadat jako v následujícím příkladu:
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
Třída UpdateView
se chová stejně jako CreateView
. Jediným rozdílem je, že automaticky načte položku na základě parametru pk
. Django používá tuto konvenci pro primární klíč položky.
from . import models
from django.views import generic
class DogUpdateView(generic.CreateView):
model = models.Dog
template_name = 'dog_form.html'
fields = ['name', 'description', 'shelter']
Po úspěšném vytvoření nebo aktualizaci položky django přesměruje na stránku podrobností položky. Načte adresu URL podrobností pomocí get_absolute_url
přidruženého modelu. Tuto metodu implementujete vrácením správné adresy URL. Příslušnou adresu URL můžete načíst z adresy URLLconf pomocí .reverse
Poznámka kwargs
se používá k předání parametru primárního pk
klíče do trasy.
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
Třída DeleteView
je podobná UpdateView
. Umožňuje uživateli odstranit položku a identifikuje položku, která má být odstraněna pomocí pk
. Na rozdíl od UpdateView
položky není potřeba, fields
protože odstraníte celou položku. Vzhledem k tomu, že se nově nevytvořila nebo neaktualizovala žádná položka, musíme určit, kam chceme uživatele přesměrovat. Přesměrování můžeme vytvořit tak, že nastavíme success_url
odpovídající hodnotu. Adresu URL můžete vyhledat pomocí .reverse_lazy
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')
Poznámka:
Používáme reverse_lazy
kvůli pořadí, ve kterém jsou informace načteny do Django.
Šablony formulářů pro vytvoření a aktualizaci
Obecná zobrazení nám můžou dynamicky vytvořit formulář HTML. Stačí zadat šablonu, která bude sloužit jako zástupný symbol formuláře. Zástupná šablona zajistí, že formulář odpovídá zbytku našeho webu. Naštěstí k jeho vytvoření nepotřebujeme moc kódu.
Obecná zobrazení automaticky vytvoří proměnnou form
, která bude naše šablona používat. Prvky formuláře poskytované Django lze zobrazit uvnitř <p>
značek nebo jako <table>
.
Proměnná form
obsahuje všechny odpovídající html pro vytvoření ovládacích prvků z formuláře. Neobsahuje<form>
samotnou značku ani tlačítko odeslat. Naše šablona musí obsahovat čtyři položky:
- Element
form
se nastavenou namethod
HODNOTU POST , protože toto nastavení aktivuje operaci uložení na serveru. - Kód
{% csrf_token %}
pro přidání tokenu CSRF, aby se zabránilo falšování identity. - Kód
{{ form.as_p }}
nebo{{ form.as_table }}
zobrazení dynamicky generovaného formuláře. - Tlačítko
submit
.
Následující kód může fungovat jako hostitel pro jakýkoli obecný formulář zobrazení.
<form method="post">{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save</button>
</form>