Formularze Django forms obsługują pełny cykl życia danych wejściowych od użytkownika: renderowanie pól formularza HTML, walidowanie przesłanych danych i konwertowanie ich na czyste wartości Pythona. Abstrakcyjnie oddzielają one żmudną, podatną na błędy pracę ręcznego obsługiwania danych wejściowych i walidacji — jest to ważna cecha produktywności i bezpieczeństwa.
Podstawowy formularz
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100)
email = forms.EmailField() # validates email format
age = forms.IntegerField(min_value=0, required=False)
message = forms.CharField(widget=forms.Textarea)
Każde pole formularza deklaruje swój typ i reguły walidacji. Formularz może renderować się jako HTML i walidować dane wejściowe względem tych reguł.
Obsługa formularza w widoku (standardowy wzorzec)
def contact(request):
if request.method == "POST":
form = ContactForm(request.POST) # bind submitted data
if form.is_valid(): # run validation
# cleaned_data = validated, type-converted Python values
name = form.cleaned_data["name"]
send_email(form.cleaned_data)
return redirect("success")
else:
form = ContactForm() # empty form for GET
return render(request, "contact.html", {"form": form})
Kluczowe metody: is_valid() uruchamia walidację, a przy powodzeniu cleaned_data daje ci bezpieczne, zwalidowane wartości przekonwertowane na typ. W przypadku niepowodzenia formularz zachowuje dane wejściowe i zbiera komunikaty błędów.
ModelForms — formularze z modeli (DRY)
from django.forms import ModelForm
class ArticleForm(ModelForm):
class Meta:
model = Article # build the form FROM a model
fields = ["title", "body", "published"] # which fields to include
# ModelForm can SAVE directly to the database
def create(request):
form = ArticleForm(request.POST)
if form.is_valid():
form.save() # creates/updates the model instance!
ModelForms generują formularz automatycznie z pól modelu i mogą zapisywać bezpośrednio do bazy danych — wcielając zasadę DRY (model napędza formularz), eliminując boilerplate dla formularzy CRUD.
Walidacja niestandardowa
class SignupForm(forms.Form):
password = forms.CharField()
confirm = forms.CharField()
def clean_password(self): # field-level validation
pw = self.cleaned_data["password"]
if len(pw) < 8:
raise forms.ValidationError("Too short")
return pw
def clean(self): # form-level (cross-field) validation
data = super().clean()
if data.get("password") != data.get("confirm"):
raise forms.ValidationError("Passwords don't match")
Renderowanie i bezpieczeństwo
<form method="post">
{% csrf_token %} <!-- REQUIRED — Django's built-in CSRF protection -->
{{ form.as_p }} <!-- render all fields as <p> elements -->
<button type="submit">Submit</button>
</form>
Formularze integrują się z ochroną CSRF Django ({% csrf_token %}) i automatycznie renderują pola z błędami walidacji.
Dlaczego to ważne
Formularze Django są kluczową cechą bezpiecznego i produktywnego obsługiwania danych wejściowych od użytkownika — a prawidłowa obsługa danych wejściowych jest zarówno wszechobecna (niemal każda aplikacja ma formularze), jak i krytyczna dla bezpieczeństwa.
Zrozumienie formularzy jest niezbędne, ponieważ abstrakcyjnie oddzielają one żmudną, podatną na błędy pracę obsługi danych wejściowych: renderowanie pól HTML, walidowanie danych względem reguł, konwertowanie ich na czyste, typizowane wartości Pythona (cleaned_data), zachowywanie danych wejściowych i uwidacznianie błędów w przypadku niepowodzenia, oraz ochronę przed atakami.
Aspekt walidacji jest szczególnie ważny dla bezpieczeństwa i niezawodności — formularze zapewniają, że nigdy nie ufasz surowym danym od użytkownika, łapiąc zdeformowane lub złośliwe dane przed ich dotarciem do twojej logiki biznesowej. ModelForms to duża wygrana pod względem produktywności, wcielająca zasadę DRY poprzez generowanie formularzy bezpośrednio z modeli i zapisywanie do bazy danych przy minimalnym kodzie — eliminując boilerplate dla niezwykle częstego przypadku formularzy CRUD.
Znajomość standardowego wzorca widoku (is_valid() + cleaned_data), sposób dodawania niestandardowej walidacji na poziomie pola i między polami, ModelForms dla formularzy wspieranego modelami, oraz integracja z ochroną CSRF jest fundamentalna dla budowania jakiejkolwiek aplikacji Django, która akceptuje dane od użytkownika.
Formularze łączą obsługę danych wejściowych, walidację, bezpieczeństwo i warstwę modelu, czyniąc je ważną, często używaną częścią frameworka i kluczowym powodem, dla którego Django jest tak produktywne dla aplikacji intensywnie pracujących z danymi.
