Edytowanie danych przy użyciu widoków ogólnych
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.
- Użytkownik wysyła żądanie GET , aby zasygnalizować, że formularz ma utworzyć nowy element.
- Serwer wysyła formularz ze specjalnym tokenem, aby zapobiec fałszerzowaniu żądania między witrynami (CSRF).
- Użytkownik ukończy formularz i wybierze opcję przesyłania, która wysyła żądanie POST, aby wskazać, że formularz został ukończony.
- Serwer weryfikuje token CSRF, aby upewnić się, że nie doszło do manipulacji.
- 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.
- Serwer próbuje zapisać element w bazie danych. W przypadku niepowodzenia komunikat o błędzie zostanie zwrócony użytkownikowi.
- 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
, UpdateView
i 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 UpdateView
klasy . Umożliwia użytkownikowi usunięcie elementu i zidentyfikowanie elementu do usunięcia przy użyciu polecenia pk
. W przeciwieństwie do UpdateView
elementu 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 zestawemmethod
POST , 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>