首页 > 解决方案 > 属性错误:必须在测试中使用 URLconf 中的对象 pk 或 slug 调用通用详细信息视图

问题描述

我今天花了很多时间查看其他在此处和整个 Google 中引用此问题的帖子。但是,当这种情况发生在测试中时,我无法找到解决方案。我在我的项目中使用 pytest 并且仅在测试视图时在我的一个详细视图中出现此错误。该视图本身适用于我的实际站点。这是我的代码:

视图.py

class CarrierDetailView(LoginRequiredMixin, DetailView):
    model = Carrier
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        quotes = self.object.quotes.all()
        context['quotes'] = quotes
        return context

模型.py

class Carrier(models.Model):
    TYPE_CHOICES = [
        ('WYO', 'WYO'),
        ('PRIVATE', 'Private')
    ]
    carrier_name = models.CharField(max_length=50)
    carrier_type = models.CharField(max_length=7, choices=TYPE_CHOICES)

    def __str__(self):
        return self.carrier_name

网址.py

    path('carrier/<int:pk>/', views.CarrierDetailView.as_view(), name='carrier-detail'),

和 test_views.py

class CarrierDetailViewTest(TestCase):
    def test_carrier_detail_view(self):
        self.factory = RequestFactory()
        self.carrier = models.Carrier.objects.create(carrier_name='NatGen', carrier_type='WYO', id=2)
        path = reverse('quote-checklist:carrier-detail', kwargs={'pk':2})
        request = RequestFactory().get(path)
        request.user = User.objects.create_user(username='ryan', email='ryan@email.com', password='password')
        response = views.CarrierDetailView.as_view()(request, kwargs={'pk':2})
        assert response.status_code == 200

    def test_carrier_detail_template(self):
        assert('carrier_detail.html')

请注意,在测试中,我在响应/路径中的 kwargs 和没有的情况下都收到了这个错误。我还使用以下测试代码成功测试了此视图的 url:

    def test_carrier_detail_view_url(self):
        path = reverse('quote-checklist:carrier-detail', kwargs={'pk':1})
        assert resolve(path).view_name == 'quote-checklist:carrier-detail'

我提前感谢其他人可能提供的任何见解。

标签: pythondjangopytest

解决方案


答案原来是 bdbd 的建议。我改变了我的回应

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

感谢您的帮助!


推荐阅读