首页/新闻资讯/正文详情

基于Django的传统手工艺品销售系统:技术栈、背景意义与核心代码实现

发布时间:2026/9/25 16:38:18 来源:云帆数科 栏目:资讯中心
基于Django的传统手工艺品销售系统:技术栈、背景意义与核心代码实现
温馨提示本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片1. 项目背景与意义传统手工艺品承载着深厚的文化底蕴和精湛的民间技艺是中华优秀传统文化的重要组成部分。然而在互联网经济快速发展的今天许多手工艺品仍主要依赖线下集市、旅游景点门店等传统渠道销售面临销售半径有限、信息不对称、年轻消费群体触达不足等现实困境。构建一个基于Django的传统手工艺品销售系统具有以下现实意义拓宽销售渠道借助互联网平台将地方特色手工艺品推向全国乃至全球市场打破地域限制。降低创业门槛为手工艺人、非遗传承人提供低成本的线上开店方案无需自建技术团队。文化传承与推广通过商品详情、工艺故事、匠人介绍等内容化运营让更多年轻人了解并喜爱传统手工艺。数据驱动经营系统可沉淀用户浏览、收藏、购买等行为数据帮助商家优化选品和营销策略。2. 技术栈选型本系统采用Python生态中成熟稳定的Django框架作为核心后端整体技术栈如下层次技术选型说明后端框架Django 4.x自带ORM、Admin后台、认证体系开发效率高数据库MySQL 8.0 / SQLite开发环境可用SQLite生产环境推荐MySQL前端HTML CSS JavaScript Bootstrap 5响应式布局适配PC与移动端模板引擎Django Templates服务端渲染SEO友好图片存储本地Media目录 / 阿里云OSS商品图片、工艺展示图等静态资源缓存Redis可选用于会话缓存、热门商品缓存部署Nginx Gunicorn Linux生产环境高可用部署方案选择Django的核心原因在于其内置的Admin后台可以快速实现商品、订单、用户的管理自带的认证系统免去了重复造轮子的成本ORM机制让数据库操作更加安全、简洁。3. 系统功能模块设计系统整体划分为前台用户端和后台管理端两大模块具体功能如下3.1 前台用户端用户注册与登录支持邮箱注册、密码加密存储、登录状态保持。商品浏览与搜索按分类浏览手工艺品支持关键词搜索、价格筛选。商品详情页展示商品图片、工艺介绍、匠人故事、价格与库存。购物车加入购物车、修改数量、删除商品、实时计算总价。订单管理提交订单、在线支付模拟、查看订单状态、取消订单。个人中心管理收货地址、查看收藏、浏览历史订单。3.2 后台管理端商品管理上架、下架、编辑商品信息、管理库存。分类管理维护商品分类树如陶瓷、刺绣、木雕、编织等。订单管理查看订单列表、处理发货、更新订单状态。用户管理查看注册用户、禁用违规账号。数据统计展示商品销量、销售额、热门分类等基础统计。4. 数据库设计系统核心数据表包括用户表、商品分类表、商品表、购物车表、订单表、订单项表和收货地址表。以下为关键表结构设计from django.db import models from django.contrib.auth.models import User class Category(models.Model): 商品分类 name models.CharField(max_length50, verbose_name分类名称) parent models.ForeignKey( self, nullTrue, blankTrue, on_deletemodels.CASCADE, related_namechildren, verbose_name父分类 ) created_at models.DateTimeField(auto_now_addTrue) class Meta: verbose_name 商品分类 verbose_name_plural verbose_name def str(self): return self.name class Product(models.Model): 手工艺品商品 name models.CharField(max_length100, verbose_name商品名称) category models.ForeignKey( Category, on_deletemodels.CASCADE, related_nameproducts, verbose_name所属分类 ) price models.DecimalField( max_digits10, decimal_places2, verbose_name价格 ) stock models.PositiveIntegerField(default0, verbose_name库存) description models.TextField(verbose_name商品描述) craft_story models.TextField( blankTrue, verbose_name工艺故事 ) image models.ImageField( upload_toproducts/%Y/%m/, verbose_name商品图片 ) is_on_sale models.BooleanField(defaultTrue, verbose_name是否上架) sales_count models.PositiveIntegerField( default0, verbose_name销量 ) created_at models.DateTimeField(auto_now_addTrue) class Meta: verbose_name 手工艺品 verbose_name_plural verbose_name ordering [-created_at] def str(self): return self.name class CartItem(models.Model): 购物车条目 user models.ForeignKey( User, on_deletemodels.CASCADE, related_namecart_items, verbose_name用户 ) product models.ForeignKey( Product, on_deletemodels.CASCADE, verbose_name商品 ) quantity models.PositiveIntegerField(default1, verbose_name数量) added_at models.DateTimeField(auto_now_addTrue) class Meta: verbose_name 购物车条目 verbose_name_plural verbose_name unique_together (user, product) def subtotal(self): 计算小计金额 return self.product.price * self.quantity class Order(models.Model): 订单主表 STATUS_CHOICES ( (pending, 待付款), (paid, 已付款), (shipped, 已发货), (completed, 已完成), (cancelled, 已取消), ) user models.ForeignKey( User, on_deletemodels.CASCADE, related_nameorders, verbose_name下单用户 ) total_amount models.DecimalField( max_digits12, decimal_places2, verbose_name订单总金额 ) status models.CharField( max_length20, choicesSTATUS_CHOICES, defaultpending, verbose_name订单状态 ) receiver_name models.CharField(max_length50, verbose_name收货人) receiver_phone models.CharField(max_length20, verbose_name联系电话) receiver_address models.CharField(max_length200, verbose_name收货地址) created_at models.DateTimeField(auto_now_addTrue) class Meta: verbose_name 订单 verbose_name_plural verbose_name ordering [-created_at] def str(self): return f订单{self.id}-{self.user.username} class OrderItem(models.Model): 订单明细项 order models.ForeignKey( Order, on_deletemodels.CASCADE, related_nameitems, verbose_name所属订单 ) product models.ForeignKey( Product, on_deletemodels.CASCADE, verbose_name商品 ) product_name models.CharField(max_length100, verbose_name商品名称快照) price models.DecimalField( max_digits10, decimal_places2, verbose_name成交单价 ) quantity models.PositiveIntegerField(default1, verbose_name购买数量) class Meta: verbose_name 订单明细 verbose_name_plural verbose_name def subtotal(self): return self.price * self.quantity5. 核心功能代码实现5.1 商品列表与搜索视图商品列表页支持按分类筛选和关键词搜索使用Django的QuerySet链式查询实现from django.shortcuts import render, get_object_or_404 from django.core.paginator import Paginator from .models import Product, Category def product_list(request): 商品列表页支持分类筛选和关键词搜索 products Product.objects.filter(is_on_saleTrue) category_id request.GET.get(category) keyword request.GET.get(q, ).strip() # 按分类筛选 if category_id: products products.filter(category_idcategory_id) 按关键词搜索商品名称或描述 if keyword: products products.filter( models.Q(name__icontainskeyword) | models.Q(description__icontainskeyword) ) 分页每页显示12个商品 paginator Paginator(products, 12) page_number request.GET.get(page) page_obj paginator.get_page(page_number) categories Category.objects.filter(parent__isnullTrue) context { page_obj: page_obj, categories: categories, current_category: category_id, keyword: keyword, } return render(request, shop/product_list.html, context)5.2 购物车添加与展示购物车操作采用登录用户关联的CartItem模型添加商品时若已存在则累加数量from django.contrib.auth.decorators import login_required from django.shortcuts import redirect, get_object_or_404 from django.contrib import messages from .models import CartItem, Product login_required def add_to_cart(request, product_id): 将商品加入购物车 product get_object_or_404(Product, pkproduct_id, is_on_saleTrue) if product.stock lt; 0: messages.error(request, 该商品暂时缺货) return redirect(shop:product_detail, product_idproduct.id) cart_item, created CartItem.objects.get_or_create( userrequest.user, productproduct, defaults{quantity: 1}, ) if not created: # 已存在则数量加1但不能超过库存 if cart_item.quantity lt; product.stock: cart_item.quantity 1 cart_item.save() else: messages.warning(request, 已达到库存上限) messages.success(request, f「{product.name}」已加入购物车) return redirect(shop:cart_detail) login_required def cart_detail(request): 购物车详情页 cart_items CartItem.objects.filter(userrequest.user) total_amount sum(item.subtotal() for item in cart_items) context { cart_items: cart_items, total_amount: total_amount, } return render(request, shop/cart_detail.html, context)5.3 订单提交与库存扣减订单提交是系统的核心事务操作需要同时创建订单主表、订单明细并扣减商品库存。为保证数据一致性使用Django的原子事务装饰器from django.db import transaction from django.shortcuts import redirect, get_object_or_404 from django.contrib import messages from .models import CartItem, Order, OrderItem, Product login_required transaction.atomic def create_order(request): 从购物车提交订单事务保证数据一致性 if request.method ! POST: return redirect(shop:cart_detail) cart_items list( CartItem.objects.filter(userrequest.user).select_related(product) ) if not cart_items: messages.error(request, 购物车为空无法下单) return redirect(shop:cart_detail) 校验库存并计算总金额 total_amount 0 for item in cart_items: product item.product if item.quantity gt; product.stock: messages.error(request, f「{product.name}」库存不足) return redirect(shop:cart_detail) total_amount product.price * item.quantity 创建订单主表 order Order.objects.create( userrequest.user, total_amounttotal_amount, receiver_namerequest.POST.get(receiver_name, ), receiver_phonerequest.POST.get(receiver_phone, ), receiver_addressrequest.POST.get(receiver_address, ), statuspaid, # 此处模拟支付成功 ) 创建订单明细并扣减库存 for item in cart_items: product item.product OrderItem.objects.create( orderorder, productproduct, product_nameproduct.name, priceproduct.price, quantityitem.quantity, ) product.stock - item.quantity product.sales_count item.quantity product.save() 清空购物车 cart_items.delete() messages.success(request, 下单成功) return redirect(shop:order_detail, order_idorder.id)5.4 后台商品管理Django Admin利用Django自带的Admin后台可以快速实现商品和订单的管理界面。通过自定义ModelAdmin配置列表展示字段、搜索和筛选功能from django.contrib import admin from .models import Category, Product, CartItem, Order, OrderItem admin.register(Category) class CategoryAdmin(admin.ModelAdmin): list_display (id, name, parent, created_at) search_fields (name,) admin.register(Product) class ProductAdmin(admin.ModelAdmin): list_display ( id, name, category, price, stock, sales_count, is_on_sale, created_at ) list_filter (is_on_sale, category, created_at) search_fields (name, description) list_editable (price, stock, is_on_sale) readonly_fields (sales_count,) class OrderItemInline(admin.TabularInline): model OrderItem extra 0 readonly_fields (product_name, price, quantity) admin.register(Order) class OrderAdmin(admin.ModelAdmin): list_display ( id, user, total_amount, status, receiver_name, created_at ) list_filter (status, created_at) search_fields (user__username, receiver_name, receiver_phone) inlines (OrderItemInline,)6. 系统部署与运行项目开发完成后可通过以下步骤在本地快速启动运行# 1. 创建并激活虚拟环境 python -m venv venv source venv/bin/activate # Windows下为 venv\Scripts\activate 2. 安装依赖 pip install django pillow mysqlclient 3. 创建数据库表 python manage.py makemigrations shop python manage.py migrate 4. 创建超级管理员 python manage.py createsuperuser 5. 启动开发服务器 python manage.py runserver生产环境部署时建议使用Nginx作为反向代理服务器Gunicorn作为WSGI应用服务器并将MySQL作为生产数据库同时配置好静态文件和媒体文件的访问路径。7. 总结与展望本文围绕基于Django的传统手工艺品销售系统从项目背景、技术栈选型、功能模块设计、数据库建模到核心代码实现进行了完整梳理。系统充分利用了Django框架的高效开发特性在较短时间内构建了一个功能完整、易于扩展的电商平台。未来可以从以下几个方向继续完善接入真实在线支付对接微信支付、支付宝等第三方支付平台。增加推荐系统基于用户浏览和购买行为实现个性化商品推荐。引入直播带货为手工艺人提供直播展示和实时互动能力。移动端小程序开发微信小程序版本进一步降低用户访问门槛。希望通过数字化手段让更多优秀的传统手工艺品被看见、被喜爱、被传承。

相关推荐

3C电子高度与台阶检测:接触式位移传感器选型与部署实战
3C电子高度与台阶检测:接触式位移传感器选型与部署实战

1. 为什么3C电子产线需要接触式位移传感器在3C电子制造车间待过的人都知道,手机中框、TWS耳机充电仓、摄像头模组、Type-C接口这些零件,对高度和台阶的管控已经到了“微米级较真”的程度。一部旗舰手机内部有上百个需要管控高度的点位,从屏幕… · 2026/9/25 16:38:12

DeskcommCRM:融合通信与客户管理的设计与实践
DeskcommCRM:融合通信与客户管理的设计与实践

这次想认真聊聊DeskcommCRM这个项目。名字乍一看就是“桌面通信 CRM”,但它并不是单纯把电话功能塞进客户管理系统里那么简单。实际做过一遍之后我才意识到,它真正想解决的是销售和客服团队日常最头痛的问题:客户资料、沟通记录、跟进任务散… · 2026/9/25 16:38:06

DeskcommCRM实践:客户信息流、API集成与权限配置的关键经验
DeskcommCRM实践:客户信息流、API集成与权限配置的关键经验

我最早注意到 DeskcommCRM,是因为团队内部对客户信息管理的不满已经到了一个临界点。销售用 Excel 记客户、用微信传沟通记录、用个人网盘存合同文件,各搞各的,一到月底复盘,光是汇总客户状态就能耗掉半天。当时我的目标很明确&am… · 2026/9/25 16:38:06

PaddleFormers 中 disco_diffusion_cnclip_vitb16 文生图模块:CLIP 引导扩散模型的中文文本到图像生成实战指南
PaddleFormers 中 disco_diffusion_cnclip_vitb16 文生图模块:CLIP 引导扩散模型的中文文本到图像生成实战指南

人工智能大模型微调模型推理服务 【免费下载链接】PaddleFormers PaddleFormers is an easy-to-use library of pre-trained large language model zoo based on PaddlePaddle. 项目地址: https://gitcode.com/gh_mirrors/pa/PaddleFormers 点击查看 免费下载 disc… · 2026/9/25 17:02:30

使用 AWS SDK for Java v2 构建多语言 Amazon Lex 聊天机器人并集成到 Spring Boot 应用
使用 AWS SDK for Java v2 构建多语言 Amazon Lex 聊天机器人并集成到 Spring Boot 应用

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 17:02:24

如何完成PaiAgent生产部署:JWT认证、环境变量与敏感配置完全指南
如何完成PaiAgent生产部署:JWT认证、环境变量与敏感配置完全指南

如何完成PaiAgent生产部署:JWT认证、环境变量与敏感配置完全指南 【免费下载链接】PaiAgent 🔥轻量级的AI工作流编排系统,类似dify、n8n,全程使用Vibe Coding,AI工具为QoderCLI。涉及到的技术栈包括SpringAI、LangGrap… · 2026/9/25 17:02:24

从 1.09b 二进制逆向到源码级比对:Devilution 贡献指南中的 IDA、SYM 与 devilution-comparer 工作流
从 1.09b 二进制逆向到源码级比对:Devilution 贡献指南中的 IDA、SYM 与 devilution-comparer 工作流

游戏开发逆向工程 【免费下载链接】devilution Diablo devolved - magic behind the 1996 computer game 项目地址: https://gitcode.com/gh_mirrors/de/devilution 点击查看 免费下载 Devilution 是 1996 年《暗黑破坏神》的逆向工程开源实现,目标是尽… · 2026/9/25 17:02:05

Python入门:安装到循环全攻略
Python入门:安装到循环全攻略

摘要:本篇笔记记录Python环境安装、常用基础数据类型、运算符与表达式、分支if语句、while循环基础语法,附带示例代码与易错点总结。一、Python的安装访问Python官网下载对应操作系统的安装包。Windows安装时务必勾选 Add Python to PATH,自动… · 2026/9/25 17:01:10

Atlas 300V实战:从YOLO模型转换到推理部署的完整指南
Atlas 300V实战:从YOLO模型转换到推理部署的完整指南

我第一次拿到Atlas 300V 24G的时候,第一反应是“这不就是张显卡嘛”。直到把卡插上服务器、照着显卡的思路折腾了一周、被各种报错反复摩擦之后,我才真正摸清这块卡的脾气。这篇文章不打算写成官方文档的复读机,而是把我实际部署YOLO模型到At… · 2026/9/25 17:01:10

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码