Сьогодні ми продовжимо наше глибоке занурення у загадковий і прекрасний світ Django Forms. На попередніх лекціях ми познайомилися з тим, навіщо потрібні форми (спойлер: щоб збирати та обробляти дані користувачів, а не сидіти з нудним виглядом в HTML-коді), і навіть встигли створити просту форму. Тепер черга за наступним кроком: навчитися обробляти дані, які користувачі відправляють через форми.
🎯 Що ми сьогодні вивчимо?
- Як отримувати дані з відправленої форми.
- Як валідовувати дані, введені користувачем.
- Як зберігати або використовувати дані після їх обробки.
- Як покращити взаємодію користувача з нашою формою.
🧙♂️ Отримання даних із форми
Коли користувач вводить дані у форму та натискає кнопку "Відправити", дані надсилаються на сервер. Django Forms бере їх під свою опіку та допомагає нам зручно з ними взаємодіяти.
Основний процес обробки
- Дані надсилаються на сервер — зазвичай методом
POST. Користувач заповнює поля на сторінці, натискає кнопкуsubmit, і браузер пакує дані у запит. - Форма створюється у представленні — у представленні ми можемо передати дані із запиту назад у форму.
- Перевіряємо валідність даних — Django форми надають вбудовані методи для валідації, про які ми поговоримо трохи пізніше.
- Дії з даними — якщо дані пройшли перевірку, ми можемо їх зберегти, використати або відправити назад.
Давайте подивимося це у коді. Створимо форми для збору контактної інформації
Форма у forms.py:
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(max_length=100, required=True)
email = forms.EmailField(required=True)
message = forms.CharField(widget=forms.Textarea, required=True)
Ця форма збирає дані: ім'я, електронну пошту та текст повідомлення.
Представлення у views.py:
from django.http import HttpResponse
from django.shortcuts import render
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
# Створюємо екземпляр форми з надісланими даними
form = ContactForm(request.POST)
if form.is_valid():
# Якщо дані валідні, отримуємо їх
name = form.cleaned_data['name']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
# (Приклад дії) Зберігаємо повідомлення у базу даних або надсилаємо на email
# Тут просто повертаємо успіх:
return HttpResponse(f"Дякуємо, {name}! Ваше повідомлення успішно відправлено.")
else:
# Якщо запит GET, створюємо порожню форму
form = ContactForm()
# Рендеримо форму у шаблон
return render(request, 'contact.html', {'form': form})
Шаблон у contact.html:
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Відправити</button>
</form>
⚙️ Основні методи обробки даних
Коли форма отримує дані, процес ділиться на два етапи:
- Валідація даних: перевірка поля на відповідність типу, межам довжини, обов'язковості тощо. Ця магія відбувається за допомогою методу
is_valid(). - Отримання даних: якщо перевірка пройдена, ви можете отримати дані зі словника
cleaned_data.
Метод is_valid()
Метод is_valid() — це чарівний захисник ваших даних. Він перевіряє, чи відповідають введені значення вимогам, визначеним у формі (наприклад, довжина рядка або формат email).
Як це виглядає в коді:
if form.is_valid():
print("Форма пройшла перевірку!")
else:
print("У формі є помилки.")
cleaned_data для отримання даних
Після валідації всі дані зберігаються у словнику form.cleaned_data. Ось як ви можете їх отримати:
if form.is_valid():
name = form.cleaned_data['name']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
🔄 Приклад обробки надісланих даних
Уявімо, що ми хочемо приймати повідомлення користувачів та зберігати їх у базу даних. Для цього створимо модель ContactMessage.
Модель у models.py:
from django.db import models
class ContactMessage(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
Тепер оновимо наше представлення:
Представлення у views.py:
from .models import ContactMessage
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
# Зберігаємо дані в базу
ContactMessage.objects.create(
name=form.cleaned_data['name'],
email=form.cleaned_data['email'],
message=form.cleaned_data['message']
)
return HttpResponse("Повідомлення надіслано та збережено в базу!")
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
Тепер ваш додаток збирає дані, перевіряє їх коректність і записує в базу. Це вже схоже на реальний додаток!
❌ Що робити з помилками?
Помилки валідації обробляються автоматично і зберігаються у формі. Наприклад, якщо користувач залишив поле email порожнім, форма сама додає повідомлення про помилку.
Спробуйте відобразити помилки у шаблоні:
{% for field in form %}
<label>{{ field.label_tag }}</label>
{{ field }}
{% if field.errors %}
<ul>
{% for error in field.errors %}
<li style="color: red;">{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
{% endfor %}
📝 Практичне завдання
- Створіть форму для створення задачі в системі управління задачами. Нехай вона містить наступні поля:
- Заголовок задачі (
CharField, максимум 200 символів). - Опис задачі (
TextField). - Термін виконання (
DateField).
- Заголовок задачі (
- Додайте обробку даних: якщо форма валідна, збережіть задачу в базі даних.
- Відобразіть помилки валідації в шаблоні, якщо форма заповнена некоректно.
🚩 Типові помилки та як їх уникнути
- Не забувайте про
csrf_tokenу шаблоні. Без нього форми, відправлені методом POST, будуть блокуватися. - Перевірте, щоб поля форми відповідали вашим очікуванням. Наприклад,
DateFieldочікує дату, а не текст! - Будьте уважні з іменами полів у
cleaned_data— вони чутливі до регістру. - Якщо ви забули перевірити
form.is_valid(), доступ доcleaned_dataпризведе до помилки.
Тепер ви знаєте, як обробити форму, ніби майстер йоги реагує на стрес: спокійно, чітко і з передбачуваними результатами. У наступній лекції ми зануримося в тему валідації даних більш детально. До зустрічі! 🙌
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ