Поле MultipleChoiceField

Поле MultipleChoiceField применяется в формах Django для выбора нескольких вариантов из списка. В отличие от ChoiceField, которое позволяет выбрать только один вариант, это поле возвращает список выбранных значений. Поле может быть использовано с различными виджетами, такими как SelectMultiple для выпадающего списка с множественным выбором или CheckboxSelectMultiple для группы чекбоксов. В качестве аргументов принимает choices - список кортежей (значение, отображение), а также стандартные аргументы валидации, такие как required, label, initial и другие.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  field_name = forms.MultipleChoiceField(
    choices=CHOICES_LIST,
    required=False,
    label="Label",
    initial=['value1', 'value2'],
    widget=forms.CheckboxSelectMultiple
  )

Пример . С выпадающим списком

Создадим форму для выбора нескольких любимых языков программирования:

pythonfrom 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})
  )

Обработка данных из такой формы в представлении:

pythonfrom 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['python', 'javascript']

Пример . С чекбоксами

Используем виджет CheckboxSelectMultiple для отображения списка в виде группы чекбоксов:

pythonfrom django import forms

GENRES = [
  ('fiction', 'Художественная литература'),
  ('science', 'Научная литература'),
  ('biography', 'Биография'),
  ('history', 'Историческая литература'),
  ('fantasy', 'Фэнтези'),
]

class BookForm(forms.Form):
  genres = forms.MultipleChoiceField(
    choices=GENRES,
    label="Выберите жанры",
    widget=forms.CheckboxSelectMultiple,
    required=False
  )

Пример использования формы в шаблоне:

pythonfrom 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})

Результат выполнения кода при выборе нескольких жанров:

python"Selected genres: ['fiction', 'fantasy']"

Пример . С валидацией

Поле MultipleChoiceField поддерживает валидацию с помощью аргументов max_length и min_length:

pythonfrom 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 фруктов.',
    }
  )

Пример обработки формы с валидацией:

pythonfrom 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 фруктов (ошибка):

python"Form errors: {'fruits': ['Можно выбрать не более 3 фруктов.']}"

Смотрите также

  • поле ChoiceField,
    которое позволяет выбрать только один вариант из списка
  • поле TypedMultipleChoiceField,
    которое преобразует выбранные значения к определенному типу
  • виджет CheckboxSelectMultiple,
    который отображает поле как группу чекбоксов
  • виджет SelectMultiple,
    который отображает поле как выпадающий список с множественным выбором