Použití obecných zobrazení k úpravě dat

Dokončeno

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.

  1. Uživatel odešle požadavek GET , aby signalizoval, že formulář chce vytvořit novou položku.
  2. Server odešle formulář se speciálním tokenem, aby se zabránilo padělání žádostí mezi weby (CSRF).
  3. Uživatel dokončí formulář a vybere odeslání, které odešle žádost POST s informací, že formulář byl dokončen.
  4. Server ověří token CSRF, aby se zajistilo, že nedošlo k manipulaci.
  5. Server ověří všechny informace, aby zajistil, že splňuje pravidla. Pokud se ověření nezdaří, vrátí se chybová zpráva.
  6. Server se pokusí uložit položku do databáze. Pokud selže, uživateli se vrátí chybová zpráva.
  7. 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, UpdateViewa 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 UpdateViewpolož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 na methodHODNOTU 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>