如何使用 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 的视图。您可以将您的视图视为与特定类别相关的 ListView
个 Product
个视图。通过这样做,您可以更方便地检索相关的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
是否在可接受值列表中。
如何获取当前代码的分页?我无法将 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 的视图。您可以将您的视图视为与特定类别相关的 ListView
个 Product
个视图。通过这样做,您可以更方便地检索相关的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
是否在可接受值列表中。