Поле ChoiceField

Поле ChoiceField применяется в формах Django для создания поля выбора из предопределенного списка вариантов. Оно отображается в HTML как выпадающий список (select) и позволяет пользователю выбрать одно значение из нескольких. Поле принимает аргументы choices (список кортежей), required (обязательность), initial (начальное значение), widget (виджет для отображения) и другие стандартные параметры полей формы.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  field_name = forms.ChoiceField(
    choices=CHOICES_LIST,
    required=True,
    initial='value1',
    widget=forms.Select,
    label='Label text'
  )

Пример . С простыми вариантами

Создадим форму с полем выбора статуса пользователя:

pythonfrom django import forms

STATUS_CHOICES = [
  ('active', 'Active'),
  ('inactive', 'Inactive'),
  ('pending', 'Pending'),
]

class UserStatusForm(forms.Form):
  status = forms.ChoiceField(
    choices=STATUS_CHOICES,
    label='User status',
    initial='pending'
  )

Пример . С использованием виджета RadioSelect

Для отображения вариантов в виде радиокнопок используем виджет RadioSelect:

pythonfrom django import forms

LEVEL_CHOICES = [
  ('1', 'Junior'),
  ('2', 'Middle'),
  ('3', 'Senior'),
]

class DeveloperForm(forms.Form):
  level = forms.ChoiceField(
    choices=LEVEL_CHOICES,
    widget=forms.RadioSelect,
    label='Developer level'
  )

Пример . С динамическими вариантами

Варианты выбора могут формироваться динамически в методе __init__:

pythonfrom django import forms
from myapp.models import Category

class ArticleForm(forms.Form):
  category = forms.ChoiceField(
    choices=[],
    label='Category'
  )

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    categories = Category.objects.all()
    choices = [(str(cat.id), cat.name) for cat in categories]
    self.fields['category'].choices = choices

Пример . С обработкой данных формы

Получим выбранное значение после валидации формы:

pythonfrom django import forms

COLOR_CHOICES = [
  ('red', 'Red'),
  ('blue', 'Blue'),
  ('green', 'Green'),
]

class ColorForm(forms.Form):
  color = forms.ChoiceField(choices=COLOR_CHOICES)

def process_form(request):
  form = ColorForm(request.POST)
  if form.is_valid():
    selected_color = form.cleaned_data['color']
    print(f"Selected color: {selected_color}")
    return "Color saved"
  return "Invalid form"

Пример . С выбором из модели

Для работы с моделями удобнее использовать ModelChoiceField, но можно и ChoiceField:

pythonfrom django import forms
from myapp.models import Product

class ProductForm(forms.Form):
  product = forms.ChoiceField(
    choices=[],
    label='Product'
  )

  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    products = Product.objects.all()
    choices = [(prod.id, prod.name) for prod in products]
    self.fields['product'].choices = choices

Пример . С пустым значением

Добавим пустой вариант для необязательного поля:

pythonfrom django import forms

ROLE_CHOICES = [
  ('', 'Select role'),
  ('admin', 'Administrator'),
  ('editor', 'Editor'),
  ('viewer', 'Viewer'),
]

class RoleForm(forms.Form):
  role = forms.ChoiceField(
    choices=ROLE_CHOICES,
    required=False,
    label='User role'
  )

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

  • поле ModelChoiceField,
    которое предназначено для выбора из моделей
  • поле TypedChoiceField,
    которое преобразует выбранное значение к заданному типу
  • поле MultipleChoiceField,
    которое позволяет выбирать несколько вариантов
  • виджет Select,
    который используется для отображения выпадающего списка