【问题标题】:Django CBV AttributeError: Generic detail view must be called with either an object pk or a slugDjango CBV AttributeError:必须使用对象 pk 或 slug 调用通用详细视图
【发布时间】:2014-09-09 15:29:15
【问题描述】:

我正在尝试在测试中获取基于类的视图的输出。

factory = RequestFactory()
request = factory.get(item.get_absolute_url()) # get_absolute_url returns '/my-slug-path/'
request.user = UserFactory(username='test', is_staff=False, is_superuser=False)
item_view = ItemDetail.as_view()
response = item_view(request)

当我运行上面的代码时,它在item_view(request) 上出错。

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

我怎样才能做到这一点? CBV 在正常的站点操作中工作正常,但是在编写测​​试时它在这一点上失败了。任何帮助将不胜感激

【问题讨论】:

    标签: python django tdd


    【解决方案1】:

    您在这里所做的是直接调用视图,而不是通过 Django 的 URL 解析器/调度程序。因此,您需要传递视图所期望的参数:在这种情况下,如错误消息所述,包括 slug/pk。所以:

    response = item_view(request, item.slug)
    

    不过,测试视图的更好方法是使用内置的测试客户端对象,这意味着您可以去掉所有该代码并用以下代码替换它:

    response = self.client.get(item.get_absolute_url())
    

    【讨论】:

    • 您的第二个选项要好得多。谢谢!
    • 我不确定这是否在 Django 的更高版本中进行了更改,但从 1.7.11 开始,我必须这样做 response = item_view(request, slug=item.slug) (也就是说,slug 作为关键字参数传入)。如果您需要在请求中设置某些内容(例如用户),这很重要。
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多