MultipleChoiceField с виджетом SelectMultiple «Значение [...] не является допустимым выбором». - PullRequest
2 голосов
/ 17 ноября 2010

В моей модели определено поле -

    languages = models.CharField(max_length = 30, choices=LANGUAGE_CHOICES, blank = True, null = True)

Выбор прост -

LANGUAGE_CHOICES = (
    ('English', 'English'),
)

Я определяю ModelForm для этой модели и переопределяю поле -

languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES, widget=forms.SelectMultiple)

Когда я заполняю форму, выбираю "Английский" и пытаюсь отправить, я получаю сообщение об ошибке -

languages ​​
Значение u "[u'English ']" не равноправильный выбор

Есть что-то основное, что я делаю неправильно?Или MultipleChoiceField в сочетании с виджетом SelectMultiple не подходит?

Кроме того, есть ли причина, по которой кортеж выбора не может иметь одно и то же значение дважды, как у меня сейчас («Английский»,'English')?

Вот еще один код, который может быть полезен для ознакомления с этим

Код шаблона:

<div class="abovepad">
<label for="id_languages">Languages:</label>
    {{form.languages}}
</div>

Часть данных POST с языками:

u'languages': [u'English'],

Соответствующий фрагмент кода ModelForm:

class ProfileForm(forms.ModelForm):        
languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES)
class Meta:
    model = Student

Как видите, я почти ничего не настраивал.В прошлом, когда я сталкивался с этой проблемой, я переключался на создание элементов в списке для моделей, а затем использовал поля ManyToMany, которые не вызывали ту же проблему.Для тех случаев, когда предметы были моделями, имело смысл;в этом случае это не так.Я просто хочу знать, делаю ли я что-то не так или эта комбо не должна работать.Если нет реального ответа, тогда я мог бы попытаться покопаться в коде формы Django, чтобы понять, почему он делает то, что делает.

Ответы [ 3 ]

8 голосов
/ 08 августа 2014

Вы должны удалить choices=LANGUAGE_CHOICES из вашей модели определения : возвращаемая вами форма представляет собой список выбранного значения, которого нет в вашем models.LANGUAGE_CHOICES

1 голос
/ 07 мая 2012

Я знаю это более года назад, но подумал, что все еще может быть полезно попытаться ответить.

Я полагаю, что здесь может быть несколько проблем, но главная проблема в том, что ModelFormожидает ключ к записи базы данных, а не строковое значение.

Я бы предложил создать Form вместо ModelForm, если вы создаете форму, не относящуюся к вашей базе данных.Но если вы хотите взаимодействовать с вашей базой данных, тогда используйте ModelForm и определите ForeignKey в своей модели Student для связи с языковой таблицей, позволяя ModelForm сделать всю работу за вас.

Пример приложения на основе моегопредположения вашей модели.

your_project/example_app/models.py:

from django.db import models

class Student(models.Model):
    name = models.CharField(max_length=255)
    language = models.ForeignKey('Language')

class Language(models.Model):
    name = models.CharField(max_length=255)

your_project/example_app/forms.py:

from django.forms import ModelForm
from example.models import Student

class StudentForm(ModelForm):
    class Meta:
        model = Student

Соответствующие документы:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform

фрагмент:

Как и следовало ожидать, типы полей модели ForeignKey и ManyToManyField являются особыми случаями:

ForeignKey представлен django.forms.ModelChoiceField,который является ChoiceField, чьи выборы являются моделью QuerySet.ManyToManyField представлен django.forms.ModelMultipleChoiceField, который является MultipleChoiceField, выбор которого - модель QuerySet.

1 голос
/ 17 ноября 2010

Сообщение об ошибке предполагает, что вместо массива languages содержит строку в кодировке Юникод, содержащую представление этого массива.languages должно оцениваться как [u'English'] (массив), но вместо этого оценивается как u"[u'English']" (строка в Unicode).

Включает ли ваша ModelForm какую-либо пользовательскую проверку (скажем, функцию clean_languages), которая может изменитьзначение для languages?

Кстати: SelectMultiple уже является виджетом по умолчанию для MultipleChoiceField, поэтому нет необходимости указывать виджет.

Некоторые вещи, которые могут быть полезны для поискапричина:

  • код шаблона, который отображает форму
  • данные POST, возвращаемые формой
  • код, используемый для вашего класса ModelForm
...