Django测试DetailView时出现需pk或slug的AttributeError问题求助
问题修复方案
以下是可直接落地的修正点:
参数传递格式错误修复
你当前调用类视图的代码为:response = views.CarrierDetailView.as_view()(request, kwargs={'pk':2})这是核心报错原因:Django基于类的视图不会从传入的
kwargs字典中提取路径参数,导致视图无法获取pk值查询对应Carrier对象。修正方式二选一即可:- 直接传递关键字参数:
response = views.CarrierDetailView.as_view()(request, pk=2) - 字典解包传递:
response = views.CarrierDetailView.as_view()(request, **{'pk':2})
- 直接传递关键字参数:
反向关系排查
你在视图get_context_data中调用了self.object.quotes.all(),但贴出的Carrier模型代码中未定义和Quote模型的关联字段。请确认Quote模型中指向Carrier的外键字段是否配置了related_name='quotes',如果没有配置会触发属性不存在的报错。测试逻辑优化
针对视图测试更推荐使用Django自带的Client工具,更贴近真实请求逻辑,无需手动构造request对象,同时可以修正你当前无效的模板校验逻辑,参考代码:from django.test import Client class CarrierDetailViewTest(TestCase): def test_carrier_detail_flow(self): # 创建测试数据 user = User.objects.create_user(username='ryan', email='ryan@email.com', password='password') carrier = models.Carrier.objects.create(carrier_name='NatGen', carrier_type='WYO', id=2) # 登录并发起请求 client = Client() client.login(username='ryan', password='password') response = client.get(reverse('quote-checklist:carrier-detail', kwargs={'pk':2})) # 校验结果 assert response.status_code == 200 self.assertTemplateUsed(response, 'carrier_detail.html')你原有的
test_carrier_detail_template方法中assert('carrier_detail.html')为无效代码,字符串恒为真,无法校验模板是否被正确调用。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

