【问题标题】:How do I pass a PK or slug to a DetailView using RequestFactory in Django?如何在 Django 中使用 RequestFactory 将 PK 或 slug 传递给 DetailView?
【发布时间】:2013-05-03 18:44:14
【问题描述】:

我正在尝试使用RequestFactory 来测试具有以下测试用例的 DetailView:

def test_device_homepage(self):
    request = self.factory.get('/devices/1/', {'pk': 1})

    response = DeviceView.as_view()(request)

    self.assertEqual(response.status_code, 404)

但是,当我运行上述测试时,我收到以下错误消息:

AttributeError: Generic detail view DeviceView must be called with either an object pk or a slug.

如果我在创建后打印请求,我可以看到以下内容:

<WSGIRequest
path:/devices/1/,
GET:<QueryDict: {u'pk': [u'1']}>,

据我所知,这应该是 DetailView 能够越过生成上述错误消息的代码点所需要的全部内容。

为完整起见,完整的回溯如下:

Traceback (most recent call last):
File "/vagrant/devices/tests/test_views.py", line 17, in test_device_homepage
response = DeviceView.as_view()(request)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py", line 68, in view
return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/base.py", line 86, in dispatch
return handler(request, *args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py", line 108, in get
self.object = self.get_object()
File "/usr/local/lib/python2.7/dist-packages/django/views/generic/detail.py", line 48, in get_object
% self.__class__.__name__)

【问题讨论】:

    标签: python django unit-testing django-views


    【解决方案1】:

    感谢 Freenode IRC 上的#django 频道,我发现以下方法是正确的方法,可以将参数一直传递到视图:

    response = DeviceView.as_view()(request, pk=1)
    

    我希望这有助于尝试使用 RequestFactory 测试 DetailView 或 DeleteView 等的其他人

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2017-05-30
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2020-03-26
      • 2020-06-17
      • 2014-08-27
      相关资源
      最近更新 更多