
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框架的高效开发特性在较短时间内构建了一个功能完整、易于扩展的电商平台。未来可以从以下几个方向继续完善接入真实在线支付对接微信支付、支付宝等第三方支付平台。增加推荐系统基于用户浏览和购买行为实现个性化商品推荐。引入直播带货为手工艺人提供直播展示和实时互动能力。移动端小程序开发微信小程序版本进一步降低用户访问门槛。希望通过数字化手段让更多优秀的传统手工艺品被看见、被喜爱、被传承。