Виджет Select

Виджет Select применяется в формах Django для отображения выпадающего списка. Он используется совместно с полями выбора, такими как ChoiceField, ModelChoiceField и другими. Виджет автоматически генерирует HTML-элемент <select> с вложенными элементами <option>, позволяя пользователю выбрать один вариант из предложенных. Виджет принимает аргументы choices, attrs для дополнительных HTML-атрибутов и allow_multiple_selected для поддержки множественного выбора.

Синтаксис

pythonfrom django import forms

class MyForm(forms.Form):
  my_field = forms.ChoiceField(
    choices=[('value1', 'Label 1'), ('value2', 'Label 2')],
    widget=forms.Select(attrs={'class': 'my-select'})
  )

Пример

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

pythonfrom django import forms

class UserStatusForm(forms.Form):
  STATUS_CHOICES = [
    ('active', 'Active'),
    ('inactive', 'Inactive'),
    ('pending', 'Pending'),
  ]
  status = forms.ChoiceField(
    choices=STATUS_CHOICES,
    widget=forms.Select(attrs={'class': 'form-control'})
  )

Результат рендеринга виджета в HTML:

python<select name="status" class="form-control" id="id_status">
  <option value="active">Active</option>
  <option value="inactive">Inactive</option>
  <option value="pending">Pending</option>
</select>

Пример

Использование виджета Select с моделью через ModelChoiceField:

pythonfrom django import forms
from myapp.models import Category

class ProductForm(forms.Form):
  category = forms.ModelChoiceField(
    queryset=Category.objects.all(),
    widget=forms.Select(attrs={'class': 'category-select'})
  )

При рендеринге виджет автоматически создаст опции на основе всех объектов Category:

python<select name="category" class="category-select" id="id_category">
  <option value="1">Electronics</option>
  <option value="2">Books</option>
  <option value="3">Clothing</option>
</select>

Пример

Настройка отображаемого текста опций с помощью метода label_from_instance:

pythonfrom django import forms
from myapp.models import Product

class ProductSelectForm(forms.Form):
  product = forms.ModelChoiceField(
    queryset=Product.objects.all(),
    widget=forms.Select,
    label_from_instance=lambda obj: f"{obj.name} - ${obj.price}"
  )

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

python<select name="product" id="id_product">
  <option value="1">Laptop - $999</option>
  <option value="2">Phone - $599</option>
  <option value="3">Tablet - $399</option>
</select>

Пример

Добавление пустой опции (placeholder) в выпадающий список:

pythonfrom django import forms

class SearchForm(forms.Form):
  STATUS_CHOICES = [
    ('published', 'Published'),
    ('draft', 'Draft'),
    ('archived', 'Archived'),
  ]
  status = forms.ChoiceField(
    choices=STATUS_CHOICES,
    widget=forms.Select,
    required=False
  )

При установке required=False и рендеринге виджета появляется пустая опция:

python<select name="status" id="id_status">
  <option value="">---------</option>
  <option value="published">Published</option>
  <option value="draft">Draft</option>
  <option value="archived">Archived</option>
</select>

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

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