Django商品目录点击跳转详情页:无需为每个商品建独立模板
解决单模板展示商品详情的方案
你不需要为每个商品单独创建模板,只需要通过动态URL传递商品标识,用同一个模板渲染不同商品的数据即可,具体步骤如下:
1. 配置动态URL路由
在项目的urls.py中,为商品详情视图添加带参数的路由(推荐用slug,可读性更强且唯一):
from django.urls import path from . import views from django.shortcuts import get_object_or_404 urlpatterns = [ # 商品列表页路由 path('catalog/', views.catalog, name='catalog'), # 商品详情页路由:通过slug匹配商品 path('product/<slug:product_slug>/', views.product_detail, name='fail'), ]
2. 编写商品详情视图
在views.py中新增视图函数,通过传入的slug获取单个商品实例,再传递给模板:
from django.shortcuts import render, get_object_or_404 from .models import products_menu def catalog(request): prods = products_menu.objects.all().order_by('mfq') return render(request, 'home.html', {'prods':prods}) # 新增商品详情视图 def product_detail(request, product_slug): # 通过slug获取商品,找不到则返回404页面 product = get_object_or_404(products_menu, slug=product_slug) # 将商品对象传递给fail模板 return render(request, 'fail.html', {'product': product})
3. 修改商品列表的跳转链接
在home.html中,把商品图片的跳转链接改成带当前商品slug的动态URL:
<a href="{% url 'fail' product_slug=products_menu.slug %}"> <img src="{{products_menu.img.url}}" width="280" height="200" > </a>
4. 编写通用的fail.html模板
创建fail.html模板,直接使用视图传递的product对象渲染商品信息(所有商品共用这一个模板):
<div class="container-fluid tm-container-content tm-mt-60"> <div class="row mb-4"> <h1 class="col-6 tm-text-primary" align="center"> {{ product.name }} </h1> </div> <div class="row"> <div class="col-sm-6"> <img src="{{ product.img.url }}" width="400" height="300" alt="{{ product.name }}"> </div> <div class="col-sm-6"> <p>Ing.{{ product.mfq }}</p> <!-- 这里可以添加更多商品相关资讯的字段展示 --> </div> </div> </div>
额外优化建议
- 为模型的
slug字段添加唯一性约束,避免重复:
slug = models.SlugField(unique=True)
- 可以在模型的
save方法中自动生成slug(比如基于商品名称),减少手动维护成本:
from django.utils.text import slugify class products_menu(models.Model): # 原有字段... slug = models.SlugField(unique=True) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name) super().save(*args, **kwargs)
内容的提问来源于stack exchange,提问作者Daniel Barajas
相关产品推荐
相关产品推荐

