如何使用 get_context_data 为我的 Class (DetailView) 使用分页?

How I can use pagination for my Class (DetailView) with get_context_data?

如何获取当前代码的分页?我无法将 DetailView 更改为 View 或 ListView,因此在此 class 我得到了产品过滤器。

class CategoryDetailView(DetailView):
    model = Category
    queryset = Category.objects.all()
    context_object_name = 'category'
    template_name = 'category_products.html'
    ...


def get_context_data(self, **kwargs):

    context = super().get_context_data(**kwargs)
    ...
    products = Product.objects.filter(id__in=[pf_['product_id'] for pf_ in pf])
    context['category_products'] = products
    return context

通常选择最方便完成这项工作的基于 class 的视图。您可以将您的视图视为与特定类别相关的 ListViewProduct 个视图。通过这样做,您可以更方便地检索相关的Product,而获取相关的Category则不那么方便,但最后一个更容易。

我们可以将视图实现为:

from django.shortcuts import get_object_or_404

class CategoryDetailView(ListView):
    model = Product
    context_object_name = 'category_products'
    template_name = 'category_products.html'
    paginate_by = 1
    # …

    def <strong>get_queryset</strong>(self):
        qs = super().get_queryset().filter(
            category__slug=self.kwargs['slug']
        )
        qd = self.request.GET.copy()
        qd.pop(self.page_kwarg, None)
        if 'search' in self.request.GET:
            qs = qs.filter(title__icontains=self.request.GET['search'])
        elif qd:
            qs = qs.filter(
                features__value__in=[v for _, vs in qd.lists() for v in vs]
        )
        if 'sort' in self.request.GET:
            qs = qs.order_by(self.request.GET['sort'])
        return qs

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['category'] = get_object_or_404(Category, pk=self.kwargs['pk'], slug=self.kwargs['slug'])
        return context

这里的get_queryset因此实现了你实现的高级查询,我们通过覆盖get_queryset来添加category。然后,此查询集将根据 ListView.

的逻辑自动分页

不过我建议简化逻辑,通常高级过滤只会让它更容易出错。此外,按任意参数排序会引入安全漏洞,例如,可以尝试过滤 some_foreignkey__some_secure_field 以暴露数据。因此,您可能想要验证 order 是否在可接受值列表中。