我有以下测试...
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)
答案 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
的字段。考虑一下,如果你没有引用另一个表的主键但ModelChoiceField
,text
选择哪个对象?如果您创建另一个具有相同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>
更改您的测试数据。