Поле ChoiceField
Поле ChoiceField применяется в формах Django для создания поля выбора из предопределенного списка вариантов. Оно отображается в HTML как выпадающий список (select) и позволяет пользователю выбрать одно значение из нескольких. Поле принимает аргументы choices (список кортежей), required (обязательность), initial (начальное значение), widget (виджет для отображения) и другие стандартные параметры полей формы.
Синтаксис
from django import forms
class MyForm(forms.Form):
field_name = forms.ChoiceField(
choices=CHOICES_LIST,
required=True,
initial='value1',
widget=forms.Select,
label='Label text'
)
Пример . С простыми вариантами
Создадим форму с полем выбора статуса пользователя:
from 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:
from 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__:
from 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
Пример . С обработкой данных формы
Получим выбранное значение после валидации формы:
from 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:
from 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
Пример . С пустым значением
Добавим пустой вариант для необязательного поля:
from 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,
который используется для отображения выпадающего списка