Formularze i dane od użytkownika

Formularze to jeden z kluczowych elementów aplikacji webowych – umożliwiają użytkownikowi wprowadzanie danych, które następnie są przetwarzane po stronie serwera. Django udostępnia potężny system formularzy, który obejmuje zarówno klasyczne formularze HTML, jak i formularze automatycznie generowane na podstawie modeli.


1. Wprowadzenie do formularzy Django

Django dostarcza dwa główne mechanizmy pracy z formularzami:

  • Form – formularze definiowane ręcznie (polami i logiką walidacji).
  • ModelForm – formularze generowane automatycznie na podstawie modeli w models.py.

Formularze w Django:

  • generują kod HTML,
  • walidują dane wejściowe,
  • umożliwiają łatwe przypisanie danych do obiektów modeli.

Przykład prostego formularza (forms.py):

Obsługa formularza w widoku (views.py):

Szablon (contact.html):

Ważne: Django wymaga tokena CSRF ({% csrf_token %}) przy metodzie POST, aby zabezpieczyć formularze przed atakami CSRF.


2. Walidacja danych

Każdy formularz w Django automatycznie waliduje dane na podstawie pól (CharField, EmailField, IntegerField itd.).

Typy walidacji:

  • Podstawowa – sprawdzanie poprawności typu (np. EmailField sprawdza format e-maila).
  • Długość i zakres – np. CharField(max_length=100), IntegerField(min_value=0, max_value=10).
  • Własne walidatory – można dodawać własne funkcje sprawdzające.

Własny walidator pola:

Metoda clean_<pole>():

Pozwala walidować jedno konkretne pole:

Metoda clean():

Pozwala walidować zależności między polami:


3. Formularze oparte na modelach (ModelForm)

ModelForm to uproszczony sposób tworzenia formularzy, które bezpośrednio zapisują dane do bazy poprzez modele.

Przykład (forms.py):

Widok (views.py):

Szablon (add_post.html):


4. Obsługa przesyłania plików

Django obsługuje przesyłanie plików (np. zdjęć, PDF-ów) przez formularze.

1. Model z polem pliku (models.py):

2. Formularz (forms.py):

3. Widok (views.py):

4. Szablon (upload.html):

5. Konfiguracja w settings.py:

6. Routing (urls.py – tylko w trybie deweloperskim):