Поле MultipleChoiceField
Поле MultipleChoiceField применяется в формах Django для
выбора нескольких вариантов из списка. В отличие от
ChoiceField, которое позволяет выбрать только один
вариант, это поле возвращает список выбранных значений.
Поле может быть использовано с различными виджетами,
такими как SelectMultiple для выпадающего списка с
множественным выбором или CheckboxSelectMultiple
для группы чекбоксов. В качестве аргументов принимает
choices - список кортежей (значение, отображение),
а также стандартные аргументы валидации, такие как
required, label, initial и другие.
Синтаксис
from django import forms
class MyForm(forms.Form):
field_name = forms.MultipleChoiceField(
choices=CHOICES_LIST,
required=False,
label="Label",
initial=['value1', 'value2'],
widget=forms.CheckboxSelectMultiple
)
Пример . С выпадающим списком
Создадим форму для выбора нескольких любимых языков программирования:
from django import forms
LANGUAGES = [
('python', 'Python'),
('javascript', 'JavaScript'),
('java', 'Java'),
('golang', 'Go'),
('rust', 'Rust'),
]
class ProgrammingForm(forms.Form):
languages = forms.MultipleChoiceField(
choices=LANGUAGES,
label="Выберите языки программирования",
widget=forms.SelectMultiple(attrs={'size': 5})
)
Обработка данных из такой формы в представлении:
from django.shortcuts import render
from .forms import ProgrammingForm
def languages_view(request):
res = None
if request.method == 'POST':
form = ProgrammingForm(request.POST)
if form.is_valid():
res = form.cleaned_data['languages']
print(res)
else:
form = ProgrammingForm()
return render(request, 'languages.html', {
'form': form,
'result': res,
})
Результат выполнения кода при выборе Python и JavaScript:
['python', 'javascript']
Пример . С чекбоксами
Используем виджет CheckboxSelectMultiple для отображения
списка в виде группы чекбоксов:
from django import forms
GENRES = [
('fiction', 'Художественная литература'),
('science', 'Научная литература'),
('biography', 'Биография'),
('history', 'Историческая литература'),
('fantasy', 'Фэнтези'),
]
class BookForm(forms.Form):
genres = forms.MultipleChoiceField(
choices=GENRES,
label="Выберите жанры",
widget=forms.CheckboxSelectMultiple,
required=False
)
Пример использования формы в шаблоне:
from django.shortcuts import render
from .forms import BookForm
def book_view(request):
form = BookForm(request.POST or None)
if request.method == 'POST' and form.is_valid():
selected_genres = form.cleaned_data['genres']
print(f"Selected genres: {selected_genres}")
return render(request, 'book.html', {'form': form})
Результат выполнения кода при выборе нескольких жанров:
"Selected genres: ['fiction', 'fantasy']"
Пример . С валидацией
Поле MultipleChoiceField поддерживает валидацию
с помощью аргументов max_length и min_length:
from django import forms
from django.core.exceptions import ValidationError
FRUITS = [
('apple', 'Яблоко'),
('banana', 'Банан'),
('orange', 'Апельсин'),
('grape', 'Виноград'),
('strawberry', 'Клубника'),
]
class FruitForm(forms.Form):
fruits = forms.MultipleChoiceField(
choices=FRUITS,
label="Выберите фрукты",
widget=forms.CheckboxSelectMultiple,
min_length=2,
max_length=3,
error_messages={
'min_length': 'Выберите как минимум 2 фрукта.',
'max_length': 'Можно выбрать не более 3 фруктов.',
}
)
Пример обработки формы с валидацией:
from django.shortcuts import render
from .forms import FruitForm
def fruit_view(request):
form = FruitForm(request.POST or None)
res = None
if request.method == 'POST':
if form.is_valid():
res = form.cleaned_data['fruits']
print(f"Valid fruits: {res}")
else:
print("Form errors:", form.errors)
return render(request, 'fruit.html', {
'form': form,
'result': res,
})
Результат выполнения кода при выборе 4 фруктов (ошибка):
"Form errors: {'fruits': ['Можно выбрать не более 3 фруктов.']}"
Смотрите также
-
поле
ChoiceField,
которое позволяет выбрать только один вариант из списка -
поле
TypedMultipleChoiceField,
которое преобразует выбранные значения к определенному типу -
виджет
CheckboxSelectMultiple,
который отображает поле как группу чекбоксов -
виджет
SelectMultiple,
который отображает поле как выпадающий список с множественным выбором