当前位置:首页 > 技术 > 正文内容

Django 与 Bootstrap 卡片组件实战:产品信息展示模板

访客 技术 2026年6月15日 1

本文将构建一个基于 Django 模板引擎与 Bootstrap 框架的产品信息卡片组件,涵盖模板条件渲染、视图数据传递及路由配置。

核心模板实现

以下模板通过 Django 模板标签实现动态数据绑定,利用 Bootstrap 的卡片结构组织产品信息:

<div class="card h-100 shadow-sm">
    <!-- 产品主图区域 -->
    <img src="{{ pkg.img_src }}" class="card-img-top object-fit-cover" 
         alt="{{ pkg.sku }}" style="height: 200px;">
    
    <div class="card-body d-flex flex-column">
        <!-- 产品标识 -->
        <h5 class="card-title mb-3">
            <span class="badge bg-secondary me-2">SKU</span>
            {{ pkg.sku }}
        </h5>
        
        <!-- 规格参数列表 -->
        <ul class="list-unstyled small text-muted mb-3">
            <li class="mb-2">
                <i class="bi bi-box-seam me-2"></i>
                外箱编码:{{ pkg.outer_carton_code }}
            </li>
            <li class="mb-2">
                <i class="bi bi-palette me-2"></i>
                托盘编码:{{ pkg.skid_code }}
            </li>
            <li class="mb-2">
                <i class="bi bi-weight me-2"></i>
                单品净重:{{ pkg.unit_net_weight }} kg
            </li>
            <li class="mb-2">
                <i class="bi bi-layers me-2"></i>
                箱装数量:{{ pkg.qty_per_carton }} / 每层箱数:{{ pkg.cartons_per_layer }}
            </li>
            <li class="mb-2">
                <i class="bi bi-arrow-up me-2"></i>
                堆码层数上限:{{ pkg.max_stack_layers }}
            </li>
            <li>
                <i class="bi bi-plus-circle me-2">/i>
                附属包材重量:{{ pkg.accessory_weight }} kg
            </li>
        </ul>
        
        <!-- 状态指示器 -->
        <div class="mt-auto pt-3 border-top">
            {% with status=pkg.is_active %}
            <span class="badge rounded-pill {% if status %}bg-success{% else %}bg-secondary{% endif %}">
                {% if status %}
                    <i class="bi bi-check-circle me-1"></i>生效中
                {% else %}
                    <i class="bi bi-x-circle me-1"></i>已停用
                {% endif %}
            </span>
            {% endwith %}
        </div>
    </div>
    
    <!-- 操作面板 -->
    <div class="card-footer bg-transparent border-0 d-grid gap-2 d-md-flex">
        <a href="{% url 'modify_sku' pkg.uuid %}" 
           class="btn btn-outline-primary btn-sm flex-fill">
            <i class="bi bi-pencil-square"></i> 修订
        </a>
        <button type="button" 
                class="btn btn-outline-danger btn-sm flex-fill"
                data-bs-toggle="modal" 
                data-bs-target="#delConfirm{{ pkg.uuid }}">
            <i class="bi bi-trash"></i> 移除
        </button>
    </div>
</div>

视图层数据准备

视图负责从模型获取数据并注入模板上下文,采用 get_object_or_404 确保数据存在性:

from django.shortcuts import render, get_object_or_404
from django.views import View
from .models import MerchandisePackage


class PackageDetailView(View):
    template_name = "inventory/sku_card.html"
    
    def get(self, request, uuid):
        # 预取关联数据减少查询次数
        package = get_object_or_404(
            MerchandisePackage.objects.select_related('category'),
            uuid=uuid
        )
        
        context = {
            'pkg': package,
            'page_title': f"{package.sku} 详情"
        }
        return render(request, self.template_name, context)

路由映射配置

URL 配置采用路径转换器约束参数类型,并设置语义化命名便于模板反向解析:

from django.urls import path
from .views import PackageDetailView, PackageUpdateView, PackageRemoveView

urlpatterns = [
    path(
        'sku/<uuid:uuid>/overview/',
        PackageDetailView.as_view(),
        name='sku_overview'
    ),
    path(
        'sku/<uuid:uuid>/modify/',
        PackageUpdateView.as_view(),
        name='modify_sku'
    ),
    path(
        'sku/<uuid:uuid>/remove/',
        PackageRemoveView.as_view(),
        name='remove_sku'
    ),
]

关键实现要点

<tr> <th>功能模块</th> <th>技术方案</th> </tr> </thead> <tbody> <tr> <td>条件渲染</td> <td>采用 {% with %} 缓存状态值,避免重复属性访问;配合 Bootstrap 工具类动态切换样式</td> </tr> <tr> <td>数据获取</td> <td>使用 select_related 预加载外键关联数据,降低 N+1 查询风险</td> </tr> <tr> <td>URL 设计</td> <td>以 UUID 替代自增 ID 作为资源标识,增强安全性与可移植性</td> </tr> <tr> <td>交互增强</td> <td>删除操作触发 Bootstrap Modal 确认,防止误操作</td> </tr> </tbody> </table>

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。