Django如何实现结构相同、展示不同数据子集的页面
同结构子集页面实现方案
两个页面结构完全一致只是数据源不同,核心思路就是复用模板、差异化传参,完全不用写两套重复代码,具体步骤如下:
- 抽离公共渲染逻辑
不用单独给折扣页写全新页面,把原来主页面里负责渲染水果列表、页面框架(导航、标题栏、底栏)的代码保留成通用模板,模板里所有和商品数据、页面文案相关的部分都用变量占位,比如页面标题、要循环渲染的水果列表,都不写死。 - 调整两个路由的视图查询逻辑
- 原有主页面路由:保持原有查询逻辑不变,查出全量水果(包含折扣和非折扣),传入通用模板,同时传入主页面对应的文案变量,比如页面标题设为「全部在售水果」。
- 新增的
/discount路由:查询数据时加过滤条件,只筛选is_discount字段为True的水果记录,把过滤后的折扣水果列表传入同一个通用模板,同时传入折扣页对应的文案变量,比如页面标题设为「特惠折扣专区」。
- 可选优化:如果列表里的商品卡片后续会在其他页面复用(比如分类页、搜索结果页),可以把单个水果的渲染代码再拆成更小的模板片段,哪里用哪里引入,进一步减少重复代码。
核心逻辑代码参考(以Python Web常用的Django框架为例,其他框架思路完全一致):
# 路由配置 urlpatterns = [ path("", views.fruit_home, name="fruit_home"), path("discount/", views.discount_fruit_list, name="discount_fruit_list"), ] # 视图层逻辑 def fruit_home(request): # 查全量水果 queryset = Fruit.objects.all() return render(request, "fruit_list.html", { "fruits": queryset, "page_title": "全部在售水果" }) def discount_fruit_list(request): # 仅查折扣水果 queryset = Fruit.objects.filter(is_discount=True) return render(request, "fruit_list.html", { "fruits": queryset, "page_title": "折扣专区水果" })
模板层fruit_list.html只需要循环传入的fruits变量渲染每个商品的名称、描述、价格即可,两个路由共用这一套模板,后续要调整页面结构、商品卡片样式,只需要改一次文件,不会出现两个页面展示不一致的问题。
内容的提问来源于stack exchange,提问作者zh__
相关产品推荐
相关产品推荐

