如何在Django单元测试中向表单传递request对象
Django单元测试中向表单传递request对象的正确方式
你的问题出在传递request的方式错误:你把request放到了表单的data参数里,但你的表单是从初始化的kwargs中提取request的,所以找不到对应键引发KeyError。
错误原因
你的表单__init__方法通过kwargs.pop("request")获取request,这意味着需要在实例化表单时,把request作为独立的关键字参数传入,而不是塞进data字典里。
修正后的测试代码
def test_AddPairedStudyForm(self): self.client.force_login(self.user) request = RequestFactory().get(reverse("researcher_ui:console")) request.user = self.user study_group = 'StudyGroup' payload = { "study_group": study_group, "paired_studies": [self.study.id, self.study1.id], } # 把request作为单独的关键字参数传给表单,而非放在data里 form = AddPairedStudyForm(data=payload, request=request) self.assertTrue(form.is_valid())
原理说明
在CBV的get_form_kwargs里,你是把request添加到表单的初始化kwargs中,单元测试里需要模拟这个逻辑:
- 表单的
data参数负责传递表单字段的提交数据 request作为表单初始化的额外参数,需要单独以关键字参数的形式传入,这样才能被__init__里的kwargs.pop("request")正确获取
内容的提问来源于stack exchange,提问作者HenryM
相关产品推荐
相关产品推荐

