带有ModelChoiceField的Django ModelForm测试用例
我试图编写一个简单的测试用例来测试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],以确保我正在选择其选项中的橙色。但什么都不管用带有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.该选项不是可用选项之
正如我所说的,这一切在视图中都是完美的。知道我在测试用例中做错了什么吗?谢谢大家! 首先,不需要在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}
谢谢你的额外提示!谢谢你的额外提示!