python - Django - 运行测试时必须使用对象 pk 或 slug 调用通用详细信息 View

标签 python django

我已经搜索了有关相同错误消息的其他问题,但似乎它应该对我有用(顺便说一句,我正在使用 Django 2。)

class Book(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(default='')

    def save(self, *args, **kwargs):
        self.slug = self.name.lower().replace(' ', '_')

我的路径:

path('<slug:slug>', views.BookDetailView.as_view(), name='book-detail'),

View :

class BookDetailView(DetailView):
    model = Book
    template_name = 'books/bookdetail.html'
    context_object_name = 'book'

尽管如此,它在运行测试时会抛出错误消息(它在通过浏览器正常请求 View 时有效)。

这是适当的测试函数(使用RequestFactory和混合器)

class TestBookDetailView:
    def test_access(self):
        mixer.blend('books.Book', name='The Book')
        req = RequestFactory().get('/books/the_book')
        req.user = mixer.blend(User)
        resp = BookDetailView.as_view()(req)
        assert resp.status_code == 200, 'Should display detail view'

这是回溯:

_______________________ TestBookDetailView.test_access ________________________

self = <books.tests.test_books_views.TestBookDetailView object at 0x000001C8E3577240>

    def test_access(self):
        mixer.blend('books.Book', name='The Book')
        req = RequestFactory().get('/books/the_book')
        req.user = mixer.blend(User)
>       resp = BookDetailView.as_view()(req)

books\tests\test_books_views.py:29:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
..\..\envs\booknote\lib\site-packages\django\views\generic\base.py:69: in view
    return self.dispatch(request, *args, **kwargs)
..\..\envs\booknote\lib\site-packages\django\utils\decorators.py:62: in _wrapper
    return bound_func(*args, **kwargs)
..\..\envs\booknote\lib\site-packages\django\contrib\auth\decorators.py:21: in _wrapped_view
    return view_func(request, *args, **kwargs)
..\..\envs\booknote\lib\site-packages\django\utils\decorators.py:58: in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
..\..\envs\booknote\lib\site-packages\django\views\generic\base.py:89: in dispatch
    return handler(request, *args, **kwargs)
..\..\envs\booknote\lib\site-packages\django\views\generic\detail.py:105: in get
    self.object = self.get_object()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <books.views.BookDetailView object at 0x000001C8E357CD68>
queryset = <QuerySet [<Book: Book object (1)>]>

    def get_object(self, queryset=None):
        """
            Return the object the view is displaying.

            Require `self.queryset` and a `pk` or `slug` argument in the URLconf.
            Subclasses can override this to return any object.
            """
        # Use a custom queryset if provided; this is required for subclasses
        # like DateDetailView
        if queryset is None:
            queryset = self.get_queryset()

        # Next, try looking up by primary key.
        pk = self.kwargs.get(self.pk_url_kwarg)
        slug = self.kwargs.get(self.slug_url_kwarg)
        if pk is not None:
            queryset = queryset.filter(pk=pk)

        # Next, try looking up by slug.
        if slug is not None and (pk is None or self.query_pk_and_slug):
            slug_field = self.get_slug_field()
            queryset = queryset.filter(**{slug_field: slug})

        # If none of those are defined, it's an error.
        if pk is None and slug is None:
            raise AttributeError("Generic detail view %s must be called with "
                                 "either an object pk or a slug."
>                                % self.__class__.__name__)
E           AttributeError: Generic detail view BookDetailView must be called with either an object pk or a slug.

..\..\envs\booknote\lib\site-packages\django\views\generic\detail.py:47: AttributeError

我做错了什么?

提前致谢

最佳答案

您需要在测试中显式传递 URL 参数。

resp = BookDetailView.as_view()(req, slug="the_book"))

或者不要使用请求工厂,而是使用内置的测试客户端:

self.client.force_login(user)
resp = self.client.get("/books/the_book")

关于python - Django - 运行测试时必须使用对象 pk 或 slug 调用通用详细信息 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792321/

相关文章:

python - MySQLdb不会返回所有用 "on duplicate key update"转换的参数

python - Pygame.movi​​e 丢失

基于 Django 类的 View 调用另一个 View

python - 有效地计算存储在数据库中的树中的叶子

python - Django : load a restricted set of fields of objects loaded using a foreign key

python - 如何在 Web 应用程序外部加载 Django 模板?

python - django.core.exceptions.ImproperlyConfigured : Error loading psycopg module: No module named psycopg

python - 向按年线分组的时间序列添加标签 - Matplotlib、Python

python - 如何绘制决策树? (类型错误 : startswith in graph from dot data, pydot)

python - 如何基于两列堆叠数据框