MultipleChoiceField со значением виджета SelectMultiple [] недопустимый выбор.

У меня есть поле, определенное в моей модели-

    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)

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

языки
Значение u"[u'English']" недопустимо.

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

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

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

Код шаблона:

<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, чтобы понять, почему он делает то, что делает.


person dpetters    schedule 16.11.2010    source источник


Ответы (3)


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

person miderose    schedule 08.08.2014
comment
Я удивлен, что этот ответ не получил должного внимания. Я столкнулся с той же проблемой, что и OP, и этот ответ сэкономил мне часы отладки! - person Manas Chaturvedi; 25.06.2015

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

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

Я бы предложил создать форму вместо 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.

person sframe    schedule 07.05.2012
comment
+1 За фрагмент из документов, который помог мне решить несвязанную проблему из-за случайного использования ModelChoiceField вместо ModelMultipleChoiceField на ManyToManyField. - person Mihai Chelaru; 29.04.2021

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

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

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

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

  • код шаблона, который отображает форму
  • POST данных, возвращаемых формой
  • код, используемый для вашего класса ModelForm
person Jordan Reiter    schedule 17.11.2010
comment
Спасибо, Джордан, за быстрый ответ. Я разместил соответствующую часть информации выше. My ModelForm не содержит ничего лишнего, и, к сожалению, избавление от явного параметра виджета не помогает. Мне кажется, что код проверки формы Django по какой-то причине берет массив в данных POST и преобразует его в строку... - person dpetters; 17.11.2010