Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有ModelChoiceField的Django ModelForm测试用例_Django_Django Testing_Modelform - Fatal编程技术网

带有ModelChoiceField的Django ModelForm测试用例

带有ModelChoiceField的Django ModelForm测试用例,django,django-testing,modelform,Django,Django Testing,Modelform,我试图编写一个简单的测试用例来测试Django表单,该表单允许将橙色对象分配给Apple对象 forms.py orange上的queryset用于确保下拉列表中的值仅为尚未分配给其他苹果的orange。此代码在调用它的视图中正确且一致地工作 在下面的测试用例中,我创建了一个全新的橙色,以确保我有一个没有分配给其他任何地方的橙色 test.py 奇怪的是,表单没有在测试用例中验证!form.errors显示:{'orange':['Select a valid choice.该选项不是可用选项之

我试图编写一个简单的测试用例来测试Django表单,该表单允许将橙色对象分配给Apple对象

forms.py

orange上的queryset用于确保下拉列表中的值仅为尚未分配给其他苹果的orange。此代码在调用它的视图中正确且一致地工作

在下面的测试用例中,我创建了一个全新的橙色,以确保我有一个没有分配给其他任何地方的橙色

test.py

奇怪的是,表单没有在测试用例中验证!form.errors显示:{'orange':['Select a valid choice.该选项不是可用选项之一。']}。当我进一步挖掘时,我可以看到我试图分配的橙色确实出现在form.fields['orange'].queryset中

我已经尽了一切努力来验证这一点。我已尝试将表单字段中的查询集更改为Orange.objects.all。我已尝试将测试用例中orange变量的创建更改为form.fields['orange'].queryset[0],以确保我正在选择其选项中的橙色。但什么都不管用


正如我所说的,这一切在视图中都是完美的。知道我在测试用例中做错了什么吗?谢谢大家!

首先,不需要在required=True\之后加\号,因为语句将以括号结尾

实例化表单类时,需要指定对象id,而不是整个橙色对象

def test_apple_orange_assignment(self):
    # More code here
    form_data = { 'orange': orange.id }
    form = AppleOrangeAssignmentForm(data=form_data, instance=apple)
    assert form.is_valid(), form.errors
就这样


提示:您可以使用assert False、form.as\p使测试失败并跟踪表单html,在那里您会发现它不是在寻找对象,而是在寻找对象id。

首先,不需要在required=True\之后加上\号,因为语句将以括号结束

实例化表单类时,需要指定对象id,而不是整个橙色对象

def test_apple_orange_assignment(self):
    # More code here
    form_data = { 'orange': orange.id }
    form = AppleOrangeAssignmentForm(data=form_data, instance=apple)
    assert form.is_valid(), form.errors
就这样


提示:您可以使用assert False、form.as\p使测试失败并跟踪表单html,在那里您会发现它不是在寻找对象,而是在寻找对象id。

来自Django官方文档中关于Django在表单中的角色的主题:

接收和处理客户提交的表格和数据

表单希望数据不是以编程方式来自客户端。在测试中,您试图传递python类orange的实例orange,但由于django表单是为接受来自客户端的数据而构建的,因此不允许对象,而只允许客户端可以输入的值,例如整数、字符串、浮点等。 因此,Django将ForeignKey字段转换为ModelChoiceField,并希望输入是实例的id,而不是实例本身,因此当您传递实例时,表单尝试以传递的实例作为id进行验证,因此失败

类模型选择字段**kwargs

默认小部件:选择

空值:无

规格化为:模型实例

验证queryset中是否存在给定id

错误消息键:必需,选项无效

示例解决方案:

form_data = {'orange': orange.id}

来自Django关于Django在表单中的角色主题的官方文件:

接收和处理客户提交的表格和数据

表单希望数据不是以编程方式来自客户端。在测试中,您试图传递python类orange的实例orange,但由于django表单是为接受来自客户端的数据而构建的,因此不允许对象,而只允许客户端可以输入的值,例如整数、字符串、浮点等。 因此,Django将ForeignKey字段转换为ModelChoiceField,并希望输入是实例的id,而不是实例本身,因此当您传递实例时,表单尝试以传递的实例作为id进行验证,因此失败

类模型选择字段**kwargs

默认小部件:选择

空值:无

规格化为:模型实例

验证queryset中是否存在给定id

错误消息键:必需,选项无效

示例解决方案:

form_data = {'orange': orange.id}

谢谢你的额外提示!谢谢你的额外提示!