2010-11-16 2 views
2

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

ответ

1

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

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

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

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

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

Спасибо Иордании, за быстрый ответ. Я разместил соответствующую информацию выше. Мой ModelForm не содержит ничего лишнего, и избавление от явного параметра виджета, к сожалению, не помогает. Мне кажется, что код проверки формы Django по какой-то причине принимает массив в данных POST и преобразует его в строку ... – dpetters

1

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

Я считаю, что здесь может быть пара проблем, но главная проблема заключается в том, что 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 представлен , который является MultipleChoiceField, выбор которого представляет собой модель QuerySet.

7

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

+1

Я удивлен, что этот ответ не получил внимания, которое он должен иметь. Я столкнулся с той же проблемой, что и OP, и этот ответ - это то, что спасло мне часы отладки! –

Смежные вопросы