ModelMultipleChoiceField

Поле ModelMultipleChoiceField используется в формах Django для выбора нескольких связанных объектов модели. Оно применяется к полям типа ManyToManyField или для пользовательского выбора нескольких записей. Аргументы передаются в виде ключевых параметров, где обязательным является queryset - набор объектов для выбора. По умолчанию поле использует виджет SelectMultiple, который отображается как список с возможностью выбора нескольких вариантов.

Синтаксис

pythonfrom 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:

Пример . С формой

Создадим форму для выбора нескольких категорий для статьи:

pythonfrom 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
  )

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

Обработаем данные формы и получим выбранные объекты:

pythonfrom 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})

Пример . С начальными значениями

Передадим начальные значения для поля при создании формы:

pythonfrom 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})

Пример . С ограничением выбора

Ограничим выбор категорий только активными:

pythonfrom 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 для отображения категорий в виде чекбоксов:

pythonfrom 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
  )

Результат выполнения кода:

python"<input type='checkbox' name='categories' value='1'> Technology"
"<input type='checkbox' name='categories' value='2'> Science"

Пример . С моделью ManyToManyField

Используем поле в ModelForm для связи с моделью, содержащей ManyToManyField:

pythonfrom django import forms
from myapp.models import Article

class ArticleModelForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content', 'categories']
    widgets = {
      'categories': forms.CheckboxSelectMultiple()
    }

Результат выполнения кода:

python"<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,
    который отображает множественный выбор в виде чекбоксов