CheckboxInput

Виджет CheckboxInput применяется для отображения поля формы в виде чекбокса. В отличие от BooleanField, который использует этот виджет по умолчанию, CheckboxInput можно использовать самостоятельно для более тонкой настройки внешнего вида чекбокса. Основные параметры виджета: attrs - словарь с HTML-атрибутами, и check_test - вызываемый объект, определяющий, должен ли чекбокс быть отмечен. Виджет рендерится в HTML-код с типом checkbox и может принимать значения из словаря choices.

Синтаксис

pythonfrom django import forms

# Базовое использование
checkbox = forms.CheckboxInput(attrs=None, check_test=None)

Пример

Создадим форму с полем, использующим виджет CheckboxInput вместо стандартного BooleanField:

pythonfrom django import forms

class UserSettingsForm(forms.Form):
  notify_by_email = forms.BooleanField(
    required=False,
    widget=forms.CheckboxInput(attrs={'class': 'form-checkbox'})
  )
  accept_terms = forms.BooleanField(
    required=True,
    widget=forms.CheckboxInput(attrs={'id': 'terms-checkbox'})
  )

Результат рендеринга формы в шаблоне:

python<input type="checkbox" name="notify_by_email" class="form-checkbox">
<input type="checkbox" name="accept_terms" id="terms-checkbox">

Пример

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

pythonfrom django import forms

def is_premium(user):
  return user.is_authenticated and user.has_perm('premium_access')

class SubscriptionForm(forms.Form):
  premium_mode = forms.BooleanField(
    required=False,
    widget=forms.CheckboxInput(
      attrs={'data-premium': 'true'},
      check_test=is_premium
    )
  )

При рендеринге виджет вызовет функцию is_premium для определения, должен ли чекбокс быть отмечен:

python# Если check_test вернет True, чекбокс будет отмечен
# <input type="checkbox" name="premium_mode" data-premium="true" checked>
# Если check_test вернет False:
# <input type="checkbox" name="premium_mode" data-premium="true">

Пример

Создание кастомного чекбокса с дополнительными атрибутами и обработкой значения:

pythonfrom django import forms

class NotificationForm(forms.Form):
  # Чекбокс с CSS-классом и обработчиком событий
  send_notifications = forms.BooleanField(
    initial=True,
    widget=forms.CheckboxInput(
      attrs={
        'class': 'toggle-switch',
        'onchange': 'handleToggle(event)',
        'data-toggle': 'notifications'
      }
    )
  )
  
  # Чекбокс с явным значением для отправки
  confirm_action = forms.BooleanField(
    required=True,
    widget=forms.CheckboxInput(
      attrs={'value': 'confirmed'}
    )
  )

Результат рендеринга формы в HTML:

python<input type="checkbox" name="send_notifications" class="toggle-switch" onchange="handleToggle(event)" data-toggle="notifications" checked>
<input type="checkbox" name="confirm_action" value="confirmed">

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

  • виджет CheckboxSelectMultiple,
    который отображает несколько чекбоксов для выбора нескольких значений
  • виджет RadioSelect,
    который отображает радиокнопки для выбора одного варианта из списка
  • виджет NullBooleanSelect,
    который отображает выпадающий список для трех состояний: True, False и None
  • виджет HiddenInput,
    который создает скрытое поле для передачи данных без отображения