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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 18:31:02