CheckboxSelectMultiple

Виджет CheckboxSelectMultiple применяется в формах Django для полей с множественным выбором. Он отображает каждый вариант выбора в виде отдельного флажка, что позволяет пользователю выбрать несколько значений одновременно. Виджет используется с полями типа MultipleChoiceField и ModelMultipleChoiceField. В отличие от SelectMultiple, который отображает список с множественным выбором, CheckboxSelectMultiple представляет все варианты визуально, что удобно при небольшом количестве вариантов.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  field_name = forms.MultipleChoiceField(
    choices=CHOICES_LIST,
    widget=forms.CheckboxSelectMultiple
  )

Виджет принимает следующие параметры при инициализации:

pythonforms.CheckboxSelectMultiple(
  attrs=None,
  choices=()
)

Где attrs - словарь с HTML-атрибутами для виджета, а choices - список или кортеж вариантов выбора.

Пример . С MultipleChoiceField

Рассмотрим простой пример формы для выбора предпочтений пользователя:

pythonfrom django import forms

class UserPreferencesForm(forms.Form):
  FRUIT_CHOICES = [
    ('apple', 'Apple'),
    ('banana', 'Banana'),
    ('orange', 'Orange'),
    ('grape', 'Grape'),
    ('strawberry', 'Strawberry'),
  ]

  favorite_fruits = forms.MultipleChoiceField(
    choices=FRUIT_CHOICES,
    widget=forms.CheckboxSelectMultiple,
    required=False,
    label="Favorite fruits"
  )

В шаблоне HTML виджет будет отображён следующим образом:

html<form method="post">
  {% csrf_token %}
  {{ form.favorite_fruits }}
  <button type="submit">Save</button>
</form>

Результат будет выглядеть как набор флажков:

html<label><input type="checkbox" value="apple"> Apple</label>
<label><input type="checkbox" value="banana"> Banana</label>
<label><input type="checkbox" value="orange"> Orange</label>
<label><input type="checkbox" value="grape"> Grape</label>
<label><input type="checkbox" value="strawberry"> Strawberry</label>

Пример . С ModelMultipleChoiceField

Теперь рассмотрим пример с моделью и выбором нескольких объектов:

pythonfrom django import forms
from myapp.models import Category

class ArticleForm(forms.Form):
  categories = forms.ModelMultipleChoiceField(
    queryset=Category.objects.all(),
    widget=forms.CheckboxSelectMultiple,
    label="Select categories"
  )

В этом случае виджет будет отображать все категории из базы данных в виде флажков. При отправке формы будут переданы ID выбранных категорий.

Обработка данных формы

После отправки формы данные можно получить через cleaned_data:

pythonfrom django import forms
from myapp.models import Category

class ArticleForm(forms.Form):
  categories = forms.ModelMultipleChoiceField(
    queryset=Category.objects.all(),
    widget=forms.CheckboxSelectMultiple,
    label="Select categories"
  )

# В view-функции:
def article_view(request):
  if request.method == 'POST':
    form = ArticleForm(request.POST)
    if form.is_valid():
      selected_categories = form.cleaned_data['categories']
      print(f"Selected categories: {selected_categories}")
      # selected_categories - это QuerySet с выбранными объектами

Результат выполнения кода:

python"Selected categories: [<Category: Technology>, <Category: Science>]"

Настройка атрибутов виджета

Можно добавлять HTML-атрибуты для дополнительной настройки внешнего вида:

pythonfrom django import forms

class UserPreferencesForm(forms.Form):
  FRUIT_CHOICES = [
    ('apple', 'Apple'),
    ('banana', 'Banana'),
    ('orange', 'Orange'),
  ]

  favorite_fruits = forms.MultipleChoiceField(
    choices=FRUIT_CHOICES,
    widget=forms.CheckboxSelectMultiple(
      attrs={
        'class': 'fruit-checkbox',
        'id': 'fruit-selector'
      }
    ),
    label="Favorite fruits"
  )

Работа с начальными значениями

Для предустановки выбранных значений используется параметр initial:

pythonfrom django import forms

class EditUserForm(forms.Form):
  FRUIT_CHOICES = [
    ('apple', 'Apple'),
    ('banana', 'Banana'),
    ('orange', 'Orange'),
    ('grape', 'Grape'),
  ]

  favorite_fruits = forms.MultipleChoiceField(
    choices=FRUIT_CHOICES,
    widget=forms.CheckboxSelectMultiple,
    label="Favorite fruits"
  )

# Создаём форму с начальными значениями:
initial_data = {
  'favorite_fruits': ['apple', 'banana']
}
form = EditUserForm(initial=initial_data)

В результате флажки для 'Apple' и 'Banana' будут отмечены при загрузке формы.

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

  • виджет SelectMultiple,
    который отображает множественный выбор в виде списка
  • виджет RadioSelect,
    который позволяет выбрать только один вариант из списка
  • виджет CheckboxInput,
    который используется для одного флажка
  • поле ModelMultipleChoiceField,
    которое предназначено для выбора нескольких моделей