РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
432 of 818 menu

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,
    который отображает множественный выбор в виде чекбоксов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить