Django如何通过单视图函数+单URL路由处理多分类页面?
完全可以实现,整套方案不需要复制任何视图、路由、模板代码,所有分类页面共用一套逻辑,后续维护成本极低。
具体实现步骤
1. 配置带参数的通用路由
不需要为每个分类单独配置URL,只需要写一条带分类名捕获规则的路由即可,访问不同分类路径时会自动把分类名作为参数传给视图:
# 你的app/urls.py文件 from django.urls import path from . import views urlpatterns = [ # 示例:访问 /tools/design/、/tools/develop/ 这类路径时,会自动把design/develop作为category_name参数传入视图 path('tools/<str:category_name>/', views.product_category_page, name='category_page'), ]
2. 编写通用视图函数
只需要写一个视图函数,接收路由传入的分类名参数完成数据筛选即可,建议加上分类不存在的404处理,避免访问无效分类时抛错:
# 你的app/views.py文件 from django.shortcuts import render, get_object_or_404 from .models import Product, Category def product_category_page(request, category_name): # 校验分类是否存在,不存在直接返回404页面 current_category = get_object_or_404(Category, name=category_name) # 筛选当前分类下的所有产品,和你之前单个分类视图的筛选逻辑完全一致 products = Product.objects.filter(category__name=category_name) # 传入模板的上下文,除了产品列表额外把当前分类传过去,方便模板展示分类标题等动态内容 context = { 'products': products, 'current_category': current_category } # 渲染同一个Tools.html模板,不需要复制多份模板文件 return render(request, 'Tools.html', context)
3. 模板适配(仅需微调原有模板,不需要复制)
你原来的Tools.html里遍历产品渲染卡片的逻辑完全不需要改动,只需要把原来写死的分类标题、面包屑这类静态内容替换成动态变量即可:
<!-- 把原来写死的分类名换成动态变量 --> <h2>{{ current_category.name }}工具列表</h2> <div class="product-card-wrapper"> {% for product in products %} <div class="product-card"> <img src="{{ product.cover.url }}" alt="{{ product.name }}"> <p class="desc">{{ product.description }}</p> <p class="price">¥{{ product.sell_price }}</p> <a href="{{ product.buy_url }}" class="buy-btn">立即购买</a> </div> {% empty %} <p>当前分类暂无上架产品</p> {% endfor %} </div>
后续维护说明
- 页面跳转时直接用模板标签
{% url 'category_page' category_name=对应分类的name字段 %}生成链接即可,不需要硬编码路径 - 后续新增产品分类时,只需要在分类表新增对应数据、上传对应分类的产品,不需要修改任何视图、路由、模板代码,新分类页面自动生效
- 如果需要给不同分类加差异化逻辑,只需要在这个通用视图里针对
category_name做分支判断即可,不需要拆分新视图
内容的提问来源于stack exchange,提问作者3an
相关产品推荐
相关产品推荐

