Created
May 12, 2026 07:58
-
-
Save sunmeat/e30a6f33cbc955abb6c2d039a2528be3 to your computer and use it in GitHub Desktop.
елементи керування форм Django
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Forms / app / templates / app / contact.html: | |
| {% extends "app/layout.html" %} | |
| {% load static %} | |
| {% block content %} | |
| <link rel="stylesheet" href="{% static 'app/css/styles.css' %}"> | |
| <div class="container mt-5"> | |
| <h2>{{ title|default:"Заявка на консультацію" }}</h2> | |
| <hr> | |
| <form method="post" class="row g-3"> | |
| {% csrf_token %} | |
| <div class="col-12"> | |
| {{ form.as_div }} | |
| </div> | |
| <div class="col-12 mt-4"><br /> | |
| <button type="submit" class="btn btn-primary btn-lg px-5"> | |
| Надіслати заявку | |
| </button> | |
| </div> | |
| </form> | |
| </div> | |
| {% endblock %} | |
| ============================================================================================================================== | |
| Forms / app / forms.py: | |
| from django import forms | |
| from django.core.validators import MinLengthValidator | |
| class ContactForm(forms.Form): | |
| """Розширена форма для демонстрації різних полів і віджетів Django""" | |
| # текстові поля | |
| full_name = forms.CharField( | |
| label="ПІБ", | |
| max_length=150, | |
| validators=[MinLengthValidator(3)], | |
| widget=forms.TextInput(attrs={ | |
| 'class': 'form-control', # bootstrap-клас для стилізації | |
| 'placeholder': 'Шевченко Тарас Григорович' | |
| }) | |
| ) | |
| email = forms.EmailField( | |
| label="Email", | |
| widget=forms.EmailInput(attrs={ | |
| 'class': 'form-control', | |
| 'placeholder': 'shevchenko.t@gmail.com' | |
| }) | |
| ) | |
| phone = forms.CharField( | |
| label="Телефон", | |
| max_length=20, | |
| required=False, | |
| widget=forms.TextInput(attrs={ | |
| 'class': 'form-control', | |
| 'placeholder': '+380 XX XXX XX XX', | |
| 'type': 'tel' | |
| }) | |
| ) | |
| # числові поля | |
| age = forms.IntegerField( | |
| label="Ваш вік", | |
| min_value=16, | |
| max_value=100, | |
| required=False, | |
| widget=forms.NumberInput(attrs={'class': 'form-control'}) | |
| ) | |
| budget = forms.DecimalField( | |
| label="Приближний бюджет (грн)", | |
| max_digits=10, | |
| decimal_places=2, | |
| required=False, | |
| widget=forms.NumberInput(attrs={ | |
| 'class': 'form-control', | |
| 'step': '100' | |
| }) | |
| ) | |
| # дата | |
| preferred_date = forms.DateField( | |
| label="Бажана дата консультації", | |
| required=False, | |
| widget=forms.DateInput(attrs={ | |
| 'class': 'form-control', | |
| 'type': 'date' | |
| }) | |
| ) | |
| # вибір (одне значення) | |
| GENDER_CHOICES = [ | |
| ('male', 'Чоловіча'), | |
| ('female', 'Жіноча'), | |
| ('other', 'Інше'), | |
| ] | |
| gender = forms.ChoiceField( | |
| label="Стать", | |
| choices=GENDER_CHOICES, | |
| required=False, | |
| widget=forms.RadioSelect(attrs={'class': 'form-check-input'}) | |
| ) | |
| CONTACT_METHOD_CHOICES = [ | |
| ('email', 'Email'), | |
| ('phone', 'Телефон'), | |
| ('telegram', 'Telegram'), | |
| ] | |
| preferred_contact = forms.ChoiceField( | |
| label="Найзручніший спосіб зв'язку", | |
| choices=CONTACT_METHOD_CHOICES, | |
| initial='email', | |
| widget=forms.Select(attrs={'class': 'form-select'}) | |
| ) | |
| # множинний вибір | |
| INTEREST_CHOICES = [ | |
| ('web_dev', 'Веб-розробка'), | |
| ('mobile', 'Мобільна розробка'), | |
| ('design', 'Дизайн'), | |
| ('marketing', 'Маркетинг'), | |
| ('business', 'Бізнес-консультація'), | |
| ('other', 'Інше'), | |
| ] | |
| interests = forms.MultipleChoiceField( | |
| label="Цікавить (можна обрати кілька)", | |
| choices=INTEREST_CHOICES, | |
| required=False, | |
| widget=forms.CheckboxSelectMultiple(attrs={'class': 'form-check-input'}) | |
| ) | |
| # булеве поле | |
| newsletter = forms.BooleanField( | |
| label="Хочу отримувати корисну розсилку", | |
| required=False, | |
| initial=True, | |
| widget=forms.CheckboxInput(attrs={'class': 'form-check-input'}) | |
| ) | |
| # текстове поле з валідацією | |
| message = forms.CharField( | |
| label="Повідомлення / питання", | |
| min_length=20, | |
| widget=forms.Textarea(attrs={ | |
| 'class': 'form-control', | |
| 'rows': 6, | |
| 'placeholder': 'Опишіть ваше питання або побажання...' | |
| }) | |
| ) | |
| def clean_message(self): | |
| message = self.cleaned_data.get('message') | |
| if message and len(message.strip()) < 20: | |
| raise forms.ValidationError("Повідомлення повинно містити хоча б 20 символів.") | |
| return message.strip() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment