在Django中的受保护视图中传递带有的查询集

在Django中的受保护视图中传递带有的查询集,django,Django,我想在Django中的某些页面登录之前限制用户访问这些页面。下面的代码工作得很好,除了我过去用视图传递一个查询集,这样它就可以显示我所有的书,而这个方法不是这样工作的 需要新的视图类登录,但未发送queryset class IndexView(TemplateView): template_name = 'quotes/index.html' args = Book.objects.all() @method_decorator(login_required)

我想在Django中的某些页面登录之前限制用户访问这些页面。下面的代码工作得很好,除了我过去用视图传递一个查询集,这样它就可以显示我所有的书,而这个方法不是这样工作的

需要新的视图类登录,但未发送queryset

class IndexView(TemplateView):
    template_name = 'quotes/index.html'
    args = Book.objects.all()
    @method_decorator(login_required)
    def dispatch(self, args):
        return super(IndexView, self).dispatch(args)
我不知道如何将query Book.objects.与此类型的视图一起传递。我的观点过去是这样的。正如您所看到的,它返回一个供模板使用的查询集。 我用它来尝试并提供登录功能

以前使用的视图类不需要登录:

class IndexView1(generic.ListView):
    template_name='quotes/index.html'
    context_object_name = 'book_list'
    def get_queryset(self):
        """Return all the book objects"""
        return Book.objects.all()

您提到的两个基于类的视图ListView older和TemplateView并不等效。您可以使用与前面相同的ListView派生类,如下所示:

class IndexView(generic.ListView):
    template_name='quotes/index.html'
    context_object_name = 'book_list'

    @method_decorator(login_required)
    def dispatch(self, args):
        return super(IndexView, self).dispatch(args)

    def get_queryset(self):
        """Return all the book objects"""
        return Book.objects.all()

我不明白你在这里做了什么。为什么不能继续使用ListView子类并覆盖其中的分派?或者为什么不能在urlconf中使用login_required包装,如图所示?看起来我被文档弄糊涂了。我不知道你可以这样使用dispatch。谢谢你的例子,这解释了很多。我是否认为只有当用户未登录时才调用dispatch,而当用户已登录时才调用dispatch?每个web请求都会通过。因此,这是添加额外安全性的正确位置。当在url中使用id时,即使我已登录,我也会收到此错误消息,并收到意外的关键字参数“pk”。有办法解决这个问题吗?