对于别的类型的表单数据我使用的是cleaned_data['列名']取得传入值,对于ChoiceField和MultipleChoiceField的传入值取值应当怎么取?如果用cleaned_data['列名']方式取值分别会得到什么样的数据结构?
cleaned_data['列名']
ChoiceField
MultipleChoiceField
认证高级PHP讲师
我們可以使用程式碼測試一下:model:
class TestModel(models.Model): TYPE_CHOICE = ( ('1', 'a'), ('2', 'b'), ('3', 'c') ) name = models.CharField(max_length=5) type_choice = models.CharField(max_length=20, choices=TYPE_CHOICE) def __unicode__(self): return self.name
作為測試,我們在表中插入三行資料:
id|name|type_choice 1|aa|a 2|bb|b 3|cc|c
form:
class IndexForm(forms.ModelForm): TYPE_CHOICE = ( ('1', 'a'), ('2', 'b'), ('3', 'c') ) test_choice_type = forms.ModelChoiceField(queryset=TestModel.objects.filter(id__lte=2)) test_multiple_choice_type = forms.ModelMultipleChoiceField(queryset=TestModel.objects.filter(id__lte=2)) class Meta: model = TestModel fields = ('name', 'type_choice')
在上面的form中,我們建立了ModelChoiceField跟ModelMutipleChoiceField,在queryset中我們查詢id小於等於2的物件。
view:
class IndexView(FormView): template_name = 'index.html' form_class = IndexForm def form_valid(self, form): name = form.cleaned_data['name'] type_choice = form.cleaned_data['type_choice'] test_choice_type = form.cleaned_data['test_choice_type'] test_multiple_choice_type = form.cleaned_data['test_multiple_choice_type'] print type(name), name print type(type_choice), type_choice print type(test_choice_type), test_choice_type print type(test_multiple_choice_type), test_multiple_choice_type return super(IndexView, self).form_valid(form)
Template:
<form action="" method="post"> {% csrf_token %} {{ form|as_bootstrap }} <button type="submit">提交</button> </form>
我們在表單中如下填寫。
輸出結果為:
<type 'unicode'> test <type 'unicode'> 1 <class 'testdjango.hei.models.TestModel'> 1 <class 'django.db.models.query.QuerySet'> [<TestModel: 1>, <TestModel: 2>]
由此可以看出:ModelChoiceField透過cleaned_data傳回值為對應queryset對應的model的實例。 ModelMultipleChoiceField透過cleaned_data傳回值為對應queryset對應的model的實例list。 其他的form痛過cleaned_data回傳值為其欄位定義類型。 Django中的文件中寫的很清楚,你可以仔細看一下。
我們可以使用程式碼測試一下:
model:
作為測試,我們在表中插入三行資料:
form:
在上面的form中,我們建立了ModelChoiceField跟ModelMutipleChoiceField,在queryset中我們查詢id小於等於2的物件。
view:
Template:
我們在表單中如下填寫。
輸出結果為:
由此可以看出:
ModelChoiceField透過cleaned_data傳回值為對應queryset對應的model的實例。
ModelMultipleChoiceField透過cleaned_data傳回值為對應queryset對應的model的實例list。
其他的form痛過cleaned_data回傳值為其欄位定義類型。
Django中的文件中寫的很清楚,你可以仔細看一下。