You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django测试DetailView时出现需pk或slug的AttributeError问题求助

问题修复方案

以下是可直接落地的修正点:

  • 参数传递格式错误修复
    你当前调用类视图的代码为:

    response = views.CarrierDetailView.as_view()(request, kwargs={'pk':2})
    

    这是核心报错原因:Django基于类的视图不会从传入的kwargs字典中提取路径参数,导致视图无法获取pk值查询对应Carrier对象。修正方式二选一即可:

    1. 直接传递关键字参数:response = views.CarrierDetailView.as_view()(request, pk=2)
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:30:03