ModelMultipleChoiceField
Поле ModelMultipleChoiceField используется в формах Django
для выбора нескольких связанных объектов модели. Оно применяется
к полям типа ManyToManyField или для пользовательского
выбора нескольких записей. Аргументы передаются в виде ключевых
параметров, где обязательным является queryset - набор
объектов для выбора. По умолчанию поле использует виджет
SelectMultiple, который отображается как список с
возможностью выбора нескольких вариантов.
Синтаксис
from django import forms
from myapp.models import Category
class MyForm(forms.Form):
categories = forms.ModelMultipleChoiceField(
queryset=Category.objects.all(),
label="Categories",
required=False,
widget=forms.CheckboxSelectMultiple
)
Основные параметры
Рассмотрим основные параметры поля ModelMultipleChoiceField:
-
queryset- обязательный параметр, задающийQuerySetдоступных для выбора объектов -
required- определяет, обязательно ли поле для заполнения (по умолчаниюTrue) -
label- текстовая метка для поля в форме -
widget- виджет для отображения поля (по умолчаниюSelectMultiple) -
initial- начальные выбранные объекты в виде списка илиQuerySet
Пример . С формой
Создадим форму для выбора нескольких категорий для статьи:
from django import forms
from myapp.models import Category
class ArticleForm(forms.Form):
title = forms.CharField(max_length=100)
content = forms.CharField(widget=forms.Textarea)
categories = forms.ModelMultipleChoiceField(
queryset=Category.objects.all(),
label="Categories",
widget=forms.CheckboxSelectMultiple
)
Пример . Использование в представлении
Обработаем данные формы и получим выбранные объекты:
from django.shortcuts import render
from django.http import HttpResponse
from .forms import ArticleForm
def create_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST)
if form.is_valid():
selected_categories = form.cleaned_data['categories']
res = ', '.join([cat.name for cat in selected_categories])
return HttpResponse(f"Selected categories: {res}")
else:
form = ArticleForm()
return render(request, 'article_form.html', {'form': form})
Пример . С начальными значениями
Передадим начальные значения для поля при создании формы:
from django.shortcuts import render
from myapp.models import Category
from .forms import ArticleForm
def edit_article(request, article_id):
article = get_object_or_404(Article, id=article_id)
initial_data = {
'title': article.title,
'content': article.content,
'categories': article.categories.all()
}
form = ArticleForm(initial=initial_data)
return render(request, 'article_form.html', {'form': form})
Пример . С ограничением выбора
Ограничим выбор категорий только активными:
from django import forms
from myapp.models import Category
class ArticleForm(forms.Form):
categories = forms.ModelMultipleChoiceField(
queryset=Category.objects.filter(is_active=True),
label="Active Categories",
required=True
)
Пример . С кастомным виджетом
Используем виджет CheckboxSelectMultiple для отображения
категорий в виде чекбоксов:
from django import forms
from myapp.models import Category
from django.forms.widgets import CheckboxSelectMultiple
class ArticleForm(forms.Form):
categories = forms.ModelMultipleChoiceField(
queryset=Category.objects.all(),
widget=CheckboxSelectMultiple,
label="Choose categories",
required=False
)
Результат выполнения кода:
"<input type='checkbox' name='categories' value='1'> Technology"
"<input type='checkbox' name='categories' value='2'> Science"
Пример . С моделью ManyToManyField
Используем поле в ModelForm для связи с моделью, содержащей
ManyToManyField:
from django import forms
from myapp.models import Article
class ArticleModelForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'categories']
widgets = {
'categories': forms.CheckboxSelectMultiple()
}
Результат выполнения кода:
"<form method='post'>"
" <label for='id_title'>Title:</label>"
" <input type='text' name='title' id='id_title'>"
" <label>Categories:</label>"
" <ul id='id_categories'>"
" <li><label><input type='checkbox' value='1'> Technology</label></li>"
" <li><label><input type='checkbox' value='2'> Science</label></li>"
" </ul>"
"</form>"
Смотрите также
-
поле
ModelChoiceField,
которое позволяет выбрать один объект из базы данных -
поле
MultipleChoiceField,
которое позволяет выбрать несколько значений из фиксированного списка -
класс
ModelForm,
который автоматически создает форму на основе модели -
виджет
CheckboxSelectMultiple,
который отображает множественный выбор в виде чекбоксов