Edytowanie danych przy użyciu widoków ogólnych

Ukończone

Podobnie jak kod wymagany do wyświetlania danych, kod umożliwiający użytkownikom modyfikowanie danych jest powtarzalny. Może to być również żmudne, ponieważ wymagane jest wykonanie kilku kroków w celu upewnienia się, że dane są prawidłowe i wysyłane poprawnie. Na szczęście ogólny system widoków może usprawnić ilość kodu potrzebnego do włączenia tej funkcji.

Tworzenie nowych elementów

Zanim dowiesz się, jak firma Django może usprawnić tworzenie oprogramowania, należy przejrzeć proces, który umożliwia użytkownikom modyfikowanie danych. Przyjrzyjmy się przepływowi pracy używanemu przez serwer do zarządzania procesem tworzenia nowego elementu lub elementu danych oraz pracy, która przechodzi do tworzenia formularza HTML.

Przepływ pracy tworzenia

Na powierzchni kod umożliwiający użytkownikowi utworzenie elementu może wydawać się banalny. Jak się okazuje, jest to zwodniczo zaangażowany proces.

  1. Użytkownik wysyła żądanie GET , aby zasygnalizować, że formularz ma utworzyć nowy element.
  2. Serwer wysyła formularz ze specjalnym tokenem, aby zapobiec fałszerzowaniu żądania między witrynami (CSRF).
  3. Użytkownik ukończy formularz i wybierze opcję przesyłania, która wysyła żądanie POST, aby wskazać, że formularz został ukończony.
  4. Serwer weryfikuje token CSRF, aby upewnić się, że nie doszło do manipulacji.
  5. Serwer weryfikuje wszystkie informacje, aby upewnić się, że spełnia reguły. Jeśli walidacja nie powiedzie się, zostanie zwrócony komunikat o błędzie.
  6. Serwer próbuje zapisać element w bazie danych. W przypadku niepowodzenia komunikat o błędzie zostanie zwrócony użytkownikowi.
  7. Po pomyślnym zapisaniu nowego elementu serwer przekierowuje użytkownika na stronę sukcesu.

Ten proces wymaga sporo kodu! Większość z nich jest kotłowa, co oznacza, że jest taka sama za każdym razem, gdy go utworzysz.

Formularze

Tworzenie formularza HTML może być żmudnym procesem. Deweloperzy często kopiują i wklejają input tagi, zapętlają listy w celu tworzenia list rozwijanych i konfigurowania przycisków radiowych. Za każdym razem, gdy model ulegnie zmianie, formularz musi zostać zaktualizowany.

Być może zauważyliśmy, że modele tworzone w usłudze Django zawierają wszystkie elementy niezbędne do utworzenia formularza. Po dodaniu różnych pól wskazaliśmy typy danych, które są powiązane z różnymi elementami HTML. Na przykład pole logiczne będzie polem wyboru, a klucz obcy jest często listą rozwijaną.

Widoki ogólne do modyfikowania danych

Jednym z kluczowych celów Django jest wyeliminowanie konieczności ciągłego ponownego tworzenia tych samych bloków kodu w całym miejscu. Aby zapewnić obsługę tego celu w przypadku modyfikacji danych, Django udostępnia kolekcję klas ogólnych i formularzy do zarządzania tym obciążeniem. Jak zobaczymy, zawiera on cały niezbędny kod, a nawet może utworzyć formularz dla nas dynamicznie. Klasy używane do tworzenia, aktualizowania i usuwania danych są nazywane CreateView, UpdateViewi DeleteView.

Createview

Klasa CreateView służy do zezwalania użytkownikowi na tworzenie elementów. Przechodzi przez poprzedni proces i dynamicznie tworzy formularz. Po pomyślnych działaniach zostanie wyświetlona strona szczegółów nowo utworzonego elementu.

Należy określić element model i template_name chcesz z nim skojarzyć tak samo jak z innymi widokami ogólnymi. Kluczową różnicą fields jest CreateView dołączenie właściwości, w której można wyświetlić listę pól edytowalnych. Korzystając z tej właściwości, możesz upewnić się, że pola, które nie powinny być edytowane, takie jak data utworzenia, nie są wyświetlane w formularzu. Widok tworzenia nowego psa może wyglądać podobnie do następującego przykładu:

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

Klasa UpdateView zachowuje się w taki sam sposób, jak CreateView. Jedyną różnicą jest to, że automatycznie ładuje element na podstawie parametru pk . Django używa tej konwencji dla klucza podstawowego dla elementu.

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 pomyślnym utworzeniu lub zaktualizowaniu elementu usługa Django przekierowuje do strony szczegółów elementu. Pobiera adres URL szczegółów przy użyciu get_absolute_url skojarzonego modelu. Tę metodę należy zaimplementować, zwracając prawidłowy adres URL. Możesz pobrać odpowiedni adres URL z adresu URLconf przy użyciu polecenia reverse. Uwaga kwargs służy do przekazywania parametru klucza podstawowego pk lub 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

Klasa DeleteView jest podobna do UpdateViewklasy . Umożliwia użytkownikowi usunięcie elementu i zidentyfikowanie elementu do usunięcia przy użyciu polecenia pk. W przeciwieństwie do UpdateViewelementu fields nie jest potrzebne, ponieważ będziesz usuwać cały element. Ponadto, ponieważ żaden element nie został nowo utworzony lub zaktualizowany, musimy określić, gdzie chcemy przekierować użytkownika. Możemy utworzyć przekierowanie, ustawiając success_url wartość na odpowiednią wartość. Adres URL można wyszukać przy użyciu polecenia 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')

Uwaga

Używamy reverse_lazy ze względu na kolejność ładowania informacji do Django.

Szablony formularzy do tworzenia i aktualizowania

Widoki ogólne mogą dynamicznie tworzyć formularz HTML. Wystarczy podać szablon, który będzie pełnić rolę symbolu zastępczego formularza. Szablon zastępczy gwarantuje, że formularz pasuje do pozostałej części naszej witryny. Na szczęście nie potrzebujemy dużo kodu, aby go utworzyć.

Widoki ogólne automatycznie tworzą zmienną form do użycia przez nasz szablon. Elementy formularza udostępniane przez platformę <table>Django mogą być wyświetlane wewnątrz <p> tagów lub jako .

Zmienna form zawiera wszystkie odpowiednie elementy HTML do utworzenia kontrolek na podstawie formularza. Nie zawiera samego tagu <form> ani przycisku przesyłania. Nasz szablon musi zawierać cztery elementy:

  • Element form z zestawem methodPOST , ponieważ to ustawienie wyzwala operację zapisywania na serwerze.
  • Kod {% csrf_token %} umożliwiający dodanie tokenu CSRF, aby zapobiec fałszowaniu.
  • Kod {{ form.as_p }} lub {{ form.as_table }} wyświetlanie dynamicznie wygenerowanego formularza.
  • Przycisk submit .

Poniższy kod może pełnić rolę hosta dla dowolnego formularza widoku ogólnego.

<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>