测试表单的Django在包含ModelChoiceField时是有效的

时间:2016-05-23 14:31:38

标签: django django-forms django-unittest

我有以下测试...

def test_contact_form(self):
    form_data = {'name': 'Reiss Johnson',
                 'email': 'reissjohnson@test.com',
                 '_type': 'General Enquiry',
                 'content': 'This is some content'}
    form = ContactForm(data=form_data)
    self.assertTrue(form.is_valid())

这最初是因为'_type'是CharField,但它现在是一个ModelChoiceField&所以有人知道为什么会失败吗?我猜我现在错误地将'_type'输入字典?

我怎样才能让上述测试再次通过?

我的表格一样......

class ContactForm(forms.Form):
      name = forms.CharField(max_length=50)
      email = forms.EmailField()
      content = forms.CharField()
      _type = forms.ModelChoiceField(queryset=EnquiryType.objects.values_list('text', flat=True), empty_label=None)

2 个答案:

答案 0 :(得分:4)

我有同样的问题。 扩展上的答案:

是的,看起来使用您引用的模型的主键可以正常工作。

这就是我的所作所为:

valid_pk = NameOfModel.objects.all()[0].pk 
# You may need to replace 0 with the right number.
form_data = {'name': 'Reiss Johnson',
             'email': 'reissjohnson@test.com',
             '_type': str(valid_pk),
             'content': 'This is some content'}

答案 1 :(得分:0)

我认为问题在于你并不了解ModelChoiceField做了什么。它将生成一个id(该模型的主键)列表,该列表对应于模型具有的每个对象,因此在保存时,它会将id保存为外键。您无法使用text来填写表单字段,EnquiryType只是模型.text的字段。考虑一下,如果你没有引用另一个表的主键但ModelChoiceFieldtext选择哪个对象?如果您创建另一个具有相同id的对象

,该怎么办?

简单修复会使用General Enquiry作为.text的对象的<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".activities.MainActivity" android:fitsSystemWindows="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- Tab Bar --> <com.rentalapp.rentmi.views.SlidingTabLayout android:id="@+id/main_content_pager_tab_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/toolbar" android:background="@color/primary" /> <!-- Content Pager --> <android.support.v4.view.ViewPager android:id="@+id/main_content_pager" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/main_content_pager_tab_bar" /> </RelativeLayout> </RelativeLayout> 更改您的测试数据。