Поле Django Multiple Choice / Checkbox Выберите несколько

У меня есть приложение Django и вы хотите отображать флажки с множественным выбором в профиле пользователя. Затем они смогут выбрать несколько элементов.

Это упрощенная версия моих моделей.py:

from profiles.choices import SAMPLE_CHOICES class Profile(models.Model): user = models.ForeignKey(User, unique=True, verbose_name_('user')) choice_field = models.CharField(_('Some choices...'), choices=SAMPLE_CHOICES, max_length=50) 

И мой класс формы:

 class ProfileForm(forms.ModelForm): choice_field = forms.MultipleChoiceField(choices=SAMPLE_CHOICES, widget=forms.CheckboxSelectMultiple) class Meta: model = Profile 

И мои view.py:

 if request.method == "POST": profile_form = form_class(request.POST, instance=profile) if profile_form.is_valid(): ... profile.save() return render_to_response(template_name, {"profile_form": profile_form,}, context_instance=RequestContext(request)) 

Я вижу, что POST отправляет только одно значение:

 choice_field u'choice_three' 

И локальные параметры vars отправляют список:

 [u'choice_one', u'choice_two', u'choice_three'] 

Все поля формы отображаются корректно, но когда я отправляю POST, я получаю сообщение об ошибке

Ошибка привязки параметра 7 – возможно, неподдерживаемый тип.

Нужно ли обрабатывать поле множественного выбора далее в представлении? Правильно ли тип поля модели? Любая помощь или ссылки были бы весьма признательны.

4 Solutions collect form web for “Поле Django Multiple Choice / Checkbox Выберите несколько”

Выбор профиля должен быть настроен как ManyToManyField для правильной работы.

Итак … ваша модель должна быть такой:

 class Choices(models.Model): description = models.CharField(max_length=300) class Profile(models.Model): user = models.ForeignKey(User, blank=True, unique=True, verbose_name='user') choices = models.ManyToManyField(Choices) 

Затем синхронизируйте базу данных и загрузите варианты с различными вариантами, которые вы хотите получить.

Теперь ModelForm будет строить себя …

 class ProfileForm(forms.ModelForm): Meta: model = Profile exclude = ['user'] 

И, наконец, мнение:

 if request.method=='POST': form = ProfileForm(request.POST) if form.is_valid(): profile = form.save(commit=False) profile.user = request.user profile.save() else: form = ProfileForm() return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request)) 

Следует отметить, что вы можете настроить профиль несколькими способами, включая наследование. Тем не менее, это должно работать и на вас.

Удачи.

Модели. CharField – это представление CharField одного из вариантов. То, что вы хотите, – это набор вариантов. Это, похоже, не реализовано в django (пока).

Вы можете использовать для себя много-много полей, но это имеет тот недостаток, что выбор должен быть помещен в базу данных. Если вы хотите использовать жестко закодированные варианты, это, вероятно, не то, что вы хотите.

Существует фрагмент django на http://djangosnippets.org/snippets/1200/ , который, кажется, решает вашу проблему, реализуя ModelField MultipleChoiceField .

Решение Brant абсолютно корректно, но мне нужно было изменить его, чтобы он работал с несколькими флажками выбора и commit=false . Вот мое решение:

models.py

 class Choices(models.Model): description = models.CharField(max_length=300) class Profile(models.Model): user = models.ForeignKey(User, blank=True, unique=True, verbose_name_('user')) the_choices = models.ManyToManyField(Choices) 

forms.py

 class ProfileForm(forms.ModelForm): the_choices = forms.ModelMultipleChoiceField(queryset=Choices.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) class Meta: model = Profile exclude = ['user'] 

views.py

 if request.method=='POST': form = ProfileForm(request.POST) if form.is_valid(): profile = form.save(commit=False) profile.user = request.user profile.save() form.save_m2m() # needed since using commit=False else: form = ProfileForm() return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request)) 

ManyToManyField не имеет хорошего выбора. Вы можете использовать некоторые фрагменты для реализации MultipleChoiceField. Вы можете вдохновиться MultiSelectField с значениями, разделенными запятыми (Field + FormField). Но у него есть некоторая ошибка. И вы можете установить django-multiselectfield. Это больше префект.

  • Python select.select, select.poll: поврежденный двойной список
  • элегантно разбивая список (или dict) на два через какую-то произвольную функцию в python
  • pyodbc - Как выполнить оператор select с использованием переменной для параметра
  • Почему select.select () работает с файлами дисков, но не epoll ()?
  • Выберите строки из Numpy Rec Array
  • Как запросить для всех групп типа 'foo', которые содержат user_x? (таблица «многие-ко-многим»)
  • Python - лучший язык программирования в мире.