Виджет Select
Виджет Select применяется в формах Django для отображения выпадающего списка. Он используется совместно с полями выбора, такими как ChoiceField, ModelChoiceField и другими. Виджет автоматически генерирует HTML-элемент <select> с вложенными элементами <option>, позволяя пользователю выбрать один вариант из предложенных. Виджет принимает аргументы choices, attrs для дополнительных HTML-атрибутов и allow_multiple_selected для поддержки множественного выбора.
Синтаксис
from 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'})
)
Пример
Создадим простую форму с полем выбора статуса пользователя:
from 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:
<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:
from 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:
<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:
from 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}"
)
Результат рендеринга с кастомизированными метками:
<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) в выпадающий список:
from 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 и рендеринге виджета появляется пустая опция:
<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,
которое используется для выбора объекта модели через выпадающий список