JavaRush /Курси /Модуль 3: Django /Обробка даних форм

Обробка даних форм

Модуль 3: Django
Рівень 12 , Лекція 2
Відкрита

Сьогодні ми продовжимо наше глибоке занурення у загадковий і прекрасний світ Django Forms. На попередніх лекціях ми познайомилися з тим, навіщо потрібні форми (спойлер: щоб збирати та обробляти дані користувачів, а не сидіти з нудним виглядом в HTML-коді), і навіть встигли створити просту форму. Тепер черга за наступним кроком: навчитися обробляти дані, які користувачі відправляють через форми.

🎯 Що ми сьогодні вивчимо?

  1. Як отримувати дані з відправленої форми.
  2. Як валідовувати дані, введені користувачем.
  3. Як зберігати або використовувати дані після їх обробки.
  4. Як покращити взаємодію користувача з нашою формою.

🧙‍♂️ Отримання даних із форми

Коли користувач вводить дані у форму та натискає кнопку "Відправити", дані надсилаються на сервер. Django Forms бере їх під свою опіку та допомагає нам зручно з ними взаємодіяти.

Основний процес обробки

  1. Дані надсилаються на сервер — зазвичай методом POST. Користувач заповнює поля на сторінці, натискає кнопку submit, і браузер пакує дані у запит.
  2. Форма створюється у представленні — у представленні ми можемо передати дані із запиту назад у форму.
  3. Перевіряємо валідність даних — Django форми надають вбудовані методи для валідації, про які ми поговоримо трохи пізніше.
  4. Дії з даними — якщо дані пройшли перевірку, ми можемо їх зберегти, використати або відправити назад.

Давайте подивимося це у коді. Створимо форми для збору контактної інформації

Форма у 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>

⚙️ Основні методи обробки даних

Коли форма отримує дані, процес ділиться на два етапи:

  1. Валідація даних: перевірка поля на відповідність типу, межам довжини, обов'язковості тощо. Ця магія відбувається за допомогою методу is_valid().
  2. Отримання даних: якщо перевірка пройдена, ви можете отримати дані зі словника 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 %}

📝 Практичне завдання

  1. Створіть форму для створення задачі в системі управління задачами. Нехай вона містить наступні поля:
    • Заголовок задачі (CharField, максимум 200 символів).
    • Опис задачі (TextField).
    • Термін виконання (DateField).
  2. Додайте обробку даних: якщо форма валідна, збережіть задачу в базі даних.
  3. Відобразіть помилки валідації в шаблоні, якщо форма заповнена некоректно.

🚩 Типові помилки та як їх уникнути

  1. Не забувайте про csrf_token у шаблоні. Без нього форми, відправлені методом POST, будуть блокуватися.
  2. Перевірте, щоб поля форми відповідали вашим очікуванням. Наприклад, DateField очікує дату, а не текст!
  3. Будьте уважні з іменами полів у cleaned_data — вони чутливі до регістру.
  4. Якщо ви забули перевірити form.is_valid(), доступ до cleaned_data призведе до помилки.

Тепер ви знаєте, як обробити форму, ніби майстер йоги реагує на стрес: спокійно, чітко і з передбачуваними результатами. У наступній лекції ми зануримося в тему валідації даних більш детально. До зустрічі! 🙌

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ