Django Admin内联表单测试失效但管理界面正常工作
问题原因及解决办法
核心原因
当UserAdmin配置了LoginInline后,Django Admin的用户创建表单会自动包含内联的登录记录表单。在测试用例中,若提交的POST数据未包含内联表单的对应结构(哪怕是空结构),表单会触发验证错误,导致用户实例无法创建,最终断言用户存在失败。而手动操作Admin界面时,Django会自动处理空内联的渲染与提交逻辑,因此不会出现问题。
验证方法
你可以在测试用例中打印表单错误信息确认问题:
response = self.client.post('/admin/auth/user/add/', data) print(response.context['adminform'].form.errors) print(response.context['inline_admin_formsets'][0].form.errors)
运行后会看到内联表单的相关错误,比如缺少Login模型必填字段,或是表单结构不匹配。
解决办法
有两种常用处理方式:
方式一:修改内联配置,取消默认空表单
在LoginInline中设置extra=0,这样Admin创建用户时默认不会显示空的登录记录内联表单,测试提交时也无需处理内联数据:class LoginInline(admin.TabularInline): model = Login extra = 0 # 关键修改方式二:在测试用例中补充内联表单数据
如果需要保留默认空内联表单,在测试的POST数据中添加符合Django内联命名规则的结构:data = { 'username': 'testuser', 'password1': 'testpass123', 'password2': 'testpass123', # 补充内联表单的空数据结构 'login_set-TOTAL_FORMS': '0', 'login_set-INITIAL_FORMS': '0', 'login_set-MIN_NUM_FORMS': '0', 'login_set-MAX_NUM_FORMS': '1000', }
内容的提问来源于stack exchange,提问作者garyj
相关产品推荐
相关产品推荐

