JavaRush /Курси /Модуль 3: Django /Кастомізація форм

Кастомізація форм

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

У цій лекції ми поговоримо про те, як стилізувати наші форми, додавати користувацькі методи для перевірки даних та перевизначати стандартні методи форм для впровадження специфічної логіки.

Додавання стилів до форм

Уявіть, що ви зайшли на сайт, який має запропонувати вам крутий функціонал, але виглядає він як сторінка з 2005-го року. Боюсь, ви там довго не затримаєтесь. Тож нам потрібно не лише функціонально, але й естетично покращити наші форми.

Django Forms автоматично генерують HTML-код. Але ось біда: цей HTML, як правило, виглядає просто. Просто! А отже, потрібно додати трохи магії CSS.

Де стилізувати?

Стилі можна додавати прямо в шаблоні або в самій формі. Ми розглянемо обидва варіанти.

Приклад: додавання CSS і Bootstrap класів

Ось як можна додати стилі полям форми, використовуючи атрибут widgets:

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(
        max_length=100,
        widget=forms.TextInput(attrs={
            'class': 'form-control',  # Bootstrap клас
            'placeholder': 'Ваше імʼя',  # Підказка
        })
    )
    email = forms.EmailField(
        widget=forms.EmailInput(attrs={
            'class': 'form-control',
            'placeholder': 'Ваш Email',
        })
    )
    message = forms.CharField(
        widget=forms.Textarea(attrs={
            'class': 'form-control',
            'placeholder': 'Ваше повідомлення',
            'rows': 5,
        })
    )
  • attrs — це магічний словник, де ви задаєте HTML-атрибути для поля: класи, підказки, розміри.
  • Ми використали Bootstrap класи для стилізації полів форми (form-control), а також задали зручні поля placeholder для користувачів.

При цьому у вашому шаблоні нічого не потрібно змінювати:

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="btn btn-primary">Відправити</button>
</form>

Результат: гарна форма з мінімальними зусиллями. Естетика рятує світ!

Перевизначення методів форми

Іноді треба працювати не лише з зовнішнім виглядом, а й з внутрішньою магією. Наприклад, що, якщо потрібно змінити мітки полів (labels) або порядок їх відображення? Або передавати у форму динамічно змінювані дані? Давайте розберемось.

Перевизначаємо метод __init__

Метод __init__ використовується для ініціалізації форми. Це чудове місце для змін — наприклад, додавання до полів якихось стартових даних.

Приклад: динамічні мітки полів

Припустимо, у нас є форма реєстрації, і ми хочемо, щоб поле імені могло бути локалізованим. Наприклад, "Name" для англійської та "Ім'я" для української.

class RegistrationForm(forms.Form):
    username = forms.CharField(max_length=50)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)

    def __init__(self, *args, **kwargs):
        user_language = kwargs.pop('language', 'en')  # Отримуємо мову з аргументів
        super().__init__(*args, **kwargs)

        if user_language == 'uk':
            self.fields['username'].label = "Ім'я користувача"
            self.fields['email'].label = 'Електронна пошта'
            self.fields['password'].label = 'Пароль'
        else:
            self.fields['username'].label = 'Username'
            self.fields['email'].label = 'Email'
            self.fields['password'].label = 'Password'

Тепер можна передати мову форми під час її ініціалізації:

form = RegistrationForm(language='uk')

І вуаля — форма коректно відобразить мітки українською мовою.

Зміна порядку полів

Все ще метод __init__, але тепер ми змінимо порядок відображення полів у формі.

class CustomOrderForm(forms.Form):
    first = forms.CharField()
    second = forms.CharField()
    third = forms.CharField()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.order_fields(['third', 'first', 'second'])  # Змінюємо порядок

Метод order_fields() — вбудований метод Django Forms. У нього є лише один недолік: задній фронт HTML все одно залишиться в тому ж порядку, якщо ваша форма рендериться через {% for field in form %}. Для красивого підходу краще явно перебудовувати порядок у шаблоні.

Користувацькі методи

Іноді вбудованої валідації недостатньо. Наприклад, ви хочете перевірити, чи існує введений email у базі. Для цього можна додати власні методи.

Приклад: метод перевірки унікальності

from django.core.exceptions import ValidationError
from django.contrib.auth.models import User

class RegistrationForm(forms.Form):
    username = forms.CharField(max_length=50)
    email = forms.EmailField()
    password = forms.CharField(widget=forms.PasswordInput)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise ValidationError('Такий email вже зареєстрований.')
        return email

    def clean_username(self):
        username = self.cleaned_data.get('username')
        if User.objects.filter(username=username).exists():
            raise ValidationError('Імʼя користувача зайняте.')
        return username

Що тут відбувається?

  • Ми перевизначили метод clean_<fieldname>(). Django автоматично викликає цей метод, якщо він існує, для кожного вказаного поля.
  • Якщо перевірка не проходить, викидається виключення ValidationError, а форма позначає це поле як невалідне.

Коли знадобляться кастомні методи?

Ви можете використовувати їх для всього, де потрібна специфічна логіка. Наприклад:

  • Перевірка унікальності.
  • Перевірка формату даних (наприклад, username може містити лише літери та цифри).
  • Попередня обробка даних (наприклад, позбавлення від пробілів).

Best practices і хитрощі

  • Намагайтесь інкапсулювати логіку. Якщо ваші методи занадто сильно залежать від форми, подумайте, чи можна винести логіку в окрему функцію або сервіс.
  • Будьте обережні з init. Не забувайте викликати super().__init__(*args, **kwargs), інакше ваша форма просто не працюватиме.
  • Мінімум логіки в шаблонах. Увесь складний функціонал і логіку розміщуйте в Python-коді, а не в HTML.
  • Краса важлива. Ніхто не буде заповнювати форму, якщо вона виглядає як форма податкової декларації 1980-го року.

Вітаю! Тепер ви знаєте, як перетворювати простенькі форми на потужні, стильні та функціональні інструменти для ваших Django-додатків. На наступному занятті ви навчитеся ще більше: працювати з помилками форм та кастомізувати їх відображення.

3
Опитування
Вступ до Django Forms, рівень 12, лекція 4
Недоступний
Вступ до Django Forms
Вступ до Django Forms
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ