2010-11-16 48 views
2

我在我的模型 - 定義一個字段帶有SelectMultiple小部件的MultipleChoiceField「值不是有效的選擇。」

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
Value u「[u'English']」不是一個有效的選擇

有沒有什麼基本的我做錯了?或者,與SelectMultiple小部件結合的MultipleChoiceField不是一種好的方式嗎?

另外,是否有任何理由爲什麼選擇元組不能有兩次相同的值,就像我現在擁有它('英語','英語')?

下面是一些額外的代碼,可能在獲得這一

模板代碼底部有用:

<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包含一個包含該數組表示的unicode字符串。 languages應評估爲[u'English'](數組),而是評估爲u"[u'English']"(unicode字符串)。

您的ModelForm是否包含可能會更改languages的值的任何自定義驗證(例如,clean_languages函數)?

順便說一句:SelectMultiple已經是MultipleChoiceField的默認控件,所以不需要指定控件。

有些事情會查找原因有用:

  • 呈現形式的形式返回
  • POST數據模板代碼
  • 代碼用於您的ModelForm類
+0

感謝喬丹,您的及時答覆。我發佈了上面的相關信息。我的ModelForm不包括任何額外的東西,並且擺脫顯式的小部件參數很不幸沒有幫助。在我看來,由於某種原因,Django表單驗證代碼將POST數據中的數組轉換爲字符串... – dpetters 2010-11-17 18:30:11

1

我現在知道這一年多了,但認爲它可能仍然有幫助嘗試一個答案。

我相信這裏可能有幾個問題,但手頭的主要問題是ModelForm期望數據庫記錄的關鍵字不是字符串值。

如果您製作與您的數據庫無關的表單,我會建議製作Form而不是ModelForm。但是如果你想與你的數據庫進行交互,那麼就使用ModelForm,然後在你的學生模型中定義一個ForeignKey來關聯語言表,讓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完全相同的問題,這個答案就是爲我節省了數小時的調試時間! – 2015-06-24 22:44:37

相關問題