You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中使用ListView筛选分类与子分类

解决Django中按指定分类筛选子分类的ListView实现方案

先修正视图继承错误

你的SubCategoriesListView错误继承了Category模型,这完全没必要,应该只继承ListView:

class SubCategoriesListView(ListView):
    model = SubCategory
    template_name = 'catalog/subcategory_list.html'
    context_object_name = 'subcategory_list'

步骤1:配置URL路由传递分类标识

在项目的urls.py里添加对应路由,用分类的slug(你的Category中url字段是唯一SlugField,用它做URL参数更友好):

from django.urls import path
from . import views

urlpatterns = [
    path('categories/', views.CategoriesListView.as_view(), name='category_list'),
    # 传递分类slug作为URL参数,命名为category_slug
    path('categories/<slug:category_slug>/subcategories/', views.SubCategoriesListView.as_view(), name='subcategory_list'),
]

步骤2:重写ListView的get_queryset方法筛选子分类

在SubCategoriesListView里重写get_queryset方法,根据URL传入的category_slug定位到对应分类,再筛选该分类下的所有子分类:

class SubCategoriesListView(ListView):
    model = SubCategory
    template_name = 'catalog/subcategory_list.html'
    context_object_name = 'subcategory_list'

    def get_queryset(self):
        # 从URL参数中获取分类slug
        category_slug = self.kwargs.get('category_slug')
        # 筛选对应分类下的子分类
        return SubCategory.objects.filter(category__url=category_slug)

可选:传递当前分类到模板上下文

如果需要在子分类列表页展示当前分类的名称等信息,可以重写get_context_data方法,把当前Category对象加入上下文:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    category_slug = self.kwargs.get('category_slug')
    # 将当前分类对象传入模板
    context['current_category'] = Category.objects.get(url=category_slug)
    return context

之后在模板里就能用{{ current_category.name }}直接展示分类名称了。

适配后续DetailView的注意点

如果后续要给子分类做DetailView,只需要在URL中补充子分类的slug参数即可,比如:

path('categories/<slug:category_slug>/subcategories/<slug:subcategory_slug>/', views.SubCategoryDetailView.as_view(), name='subcategory_detail'),

DetailView可以通过category__url和自身url字段组合筛选,和ListView的逻辑保持一致,不会产生冲突。

内容的提问来源于stack exchange,提问作者evgenyiy pasukov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:23:16