一个基于Django的进销存管理系统Demo实现
第一步:创建 Django 项目
bash
复制
django-admin startproject inventory_system cd inventory_system python manage.py startapp erp
第二步:定义数据模型(models.py)
python
复制
from django.db import models from django.contrib.auth.models import Userclass Product(models.Model):name = models.CharField(max_length=100)code = models.CharField(max_length=20, unique=True)category = models.CharField(max_length=50)specification = models.TextField(blank=True)purchase_price = models.DecimalField(max_digits=10, decimal_places=2)selling_price = models.DecimalField(max_digits=10, decimal_places=2)stock = models.IntegerField(default=0)def __str__(self):return self.nameclass PurchaseOrder(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE)quantity = models.IntegerField()order_date = models.DateTimeField(auto_now_add=True)operator = models.ForeignKey(User, on_delete=models.CASCADE)class SaleOrder(models.Model):product = models.ForeignKey(Product, on_delete=models.CASCADE)quantity = models.IntegerField()order_date = models.DateTimeField(auto_now_add=True)operator = models.ForeignKey(User, on_delete=models.CASCADE)
第三步:创建表单(forms.py)
python
复制
from django import forms from .models import Product, PurchaseOrder, SaleOrderclass ProductForm(forms.ModelForm):class Meta:model = Productfields = '__all__'class PurchaseForm(forms.ModelForm):class Meta:model = PurchaseOrderfields = ['product', 'quantity']class SaleForm(forms.ModelForm):class Meta:model = SaleOrderfields = ['product', 'quantity']
第四步:编写视图(views.py)
python
复制
from django.shortcuts import render, redirect
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Product, PurchaseOrder, SaleOrder
from .forms import ProductForm, PurchaseForm, SaleFormclass ProductListView(ListView):model = Producttemplate_name = 'erp/product_list.html'context_object_name = 'products'class ProductCreateView(CreateView):model = Productform_class = ProductFormsuccess_url = reverse_lazy('product_list')template_name = 'erp/product_form.html'class PurchaseCreateView(CreateView):model = PurchaseOrderform_class = PurchaseFormsuccess_url = reverse_lazy('purchase_list')template_name = 'erp/order_form.html'def form_valid(self, form):# 更新库存product = form.cleaned_data['product']product.stock += form.cleaned_data['quantity']product.save()form.instance.operator = self.request.userreturn super().form_valid(form)class SaleCreateView(CreateView):model = SaleOrderform_class = SaleFormsuccess_url = reverse_lazy('sale_list')template_name = 'erp/order_form.html'def form_valid(self, form):# 检查库存并更新product = form.cleaned_data['product']if product.stock >= form.cleaned_data['quantity']:product.stock -= form.cleaned_data['quantity']product.save()form.instance.operator = self.request.userreturn super().form_valid(form)else:form.add_error('quantity', '库存不足')return self.form_invalid(form)
第五步:配置 URLs(urls.py)
python
复制
from django.urls import path
from erp import viewsurlpatterns = [# 商品管理path('products/', views.ProductListView.as_view(), name='product_list'),path('products/add/', views.ProductCreateView.as_view(), name='product_add'),# 采购管理path('purchases/add/', views.PurchaseCreateView.as_view(), name='purchase_add'),# 销售管理path('sales/add/', views.SaleCreateView.as_view(), name='sale_add'),
]
第六步:创建模板(示例模板:product_list.html)
html
复制
<!DOCTYPE html>
<html>
<head><title>商品列表</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><div class="container mt-4"><h2>商品列表</h2><a href="{% url 'product_add' %}" class="btn btn-primary mb-3">新增商品</a><table class="table table-striped"><thead><tr><th>名称</th><th>编码</th><th>库存</th><th>采购价</th><th>销售价</th></tr></thead><tbody>{% for product in products %}<tr><td>{{ product.name }}</td><td>{{ product.code }}</td><td>{{ product.stock }}</td><td>{{ product.purchase_price }}</td><td>{{ product.selling_price }}</td></tr>{% endfor %}</tbody></table></div>
</body>
</html>
运行 HTML
第七步:运行迁移并创建管理员
bash
复制
python manage.py makemigrations python manage.py migrate python manage.py createsuperuser
第八步:运行开发服务器
bash
复制
python manage.py runserver
系统功能扩展建议:
-
库存预警:在商品模型中添加预警阈值字段,并在列表页显示库存状态
-
报表统计:使用Chart.js生成销售趋势图
-
权限控制:使用Django的权限系统限制不同用户的操作权限
-
供应商管理:添加Supplier模型并与采购订单关联
-
客户管理:添加Customer模型并与销售订单关联
-
条码支持:集成条形码扫描功能
-
导入导出:使用pandas实现Excel数据导入导出
这个基础版本实现了以下核心功能:
-
商品基本信息管理
-
采购入库(自动增加库存)
-
销售出库(库存校验和扣减)
-
基本操作日志记录(操作时间和操作人)
要完善系统,还需要添加以下内容:
-
订单列表视图
-
数据验证和错误处理
-
分页功能
-
搜索和过滤功能
-
详细的权限管理
-
审计日志
-
数据备份和恢复功能
建议使用以下第三方库增强功能:
-
Django Filter:实现复杂数据过滤
-
Django Import Export:实现数据导入导出
-
Django Tables2:创建更强大的表格视图
-
Django Guardian:对象级权限控制
相关文章:
一个基于Django的进销存管理系统Demo实现
第一步:创建 Django 项目 bash 复制 django-admin startproject inventory_system cd inventory_system python manage.py startapp erp 第二步:定义数据模型(models.py) python 复制 from django.db import models from d…...
【数据结构_6上篇】有关链表的oj题
import java.util.*;/* public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} }*/ public class Partition {public ListNode partition(ListNode pHead, int x) {// write code here//1.首先要判断链表是否为空的情况if(pHead null){retu…...
【QT】QWidget 概述与核心属性(API)
🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 控件概述 🦋 控件体系的发展阶段 二:🔥 QWidget 核心属性 🦋 核心属性概览🦋 用件可用(…...
微服务篇——SpringCloud
服务注册 Spring Cloud5大组件有哪些? 服务注册和发现是什么意思?Spring Cloud如何实现服务注册发现? nacos与eureka的区别 负载均衡 如何实现负载均衡? Ribbon负载均衡的策略有哪些? 如何自定义负载均衡的策略&…...
如何使用PyCharm自动化测试
如何使用PyCharm自动化测试 1.打开PyCharm右击文件,点击新建项目 按照如图配置,然后点击创建 2.创建好后,点击文件,然后点击设置 按照如图步骤,查看selenium和webdriver-manager是否存在 3.以上都完成后按照如图创…...
记一次某网络安全比赛三阶段webserver应急响应解题过程
0X01 任务说明 0X02 靶机介绍 Webserver(Web服务器)是一种软件或硬件设备,用于接收、处理并响应来自客户端(如浏览器)的HTTP请求,提供网页、图片、视频等静态或动态内容,是互联网基础设施的核心…...
c# 新建不重名的唯一文件夹
在源文件夹内创建唯一目标文件夹 string newFolder GetUniqueFolderName(sourceFolder); Directory.CreateDirectory(newFolder); /// <summary>/// 生成唯一文件夹名称(格式:新建文件夹、新建文件夹1、新建文件夹2...)…...
复现QGIS-MCP教程
由于Claude国内下载不了尝试使用Cursor 下载安装Cursor Cursor - The AI Code Editor 本示例安装的是0.46版本 UV安装 简介 安装 安装成功 配置环境变量 验证 下载代码 git clone gitgithub.com:jjsantos01/qgis_mcp.git QGIS插件安装 文件拷贝 您需要将 qgis_mcp_plu…...
SQL:JOIN 完全指南:从基础到实战应用
JOIN 是 SQL 中最重要也最常用的操作之一,它允许我们从多个表中获取关联数据。本文将全面解析 SQL 中的各种 JOIN 类型,包括 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN 以及 CROSS JOIN,并通过实际示例展示它们的应用场景。 一、JOIN 基础概念 1.1 什么是 JOIN JOIN…...
docker部署certimateSSL证书管理自动续签
开源certimate项目地址:https://github.com/usual2970/certimate 官方文档地址:https://docs.certimate.me/docs/introduction 与certbot对比 维度CertbotCertimate安装方式通过包管理器(如apt/yum)安装支持二进制文件、Docker…...
R语言——直方图
参考资料:学习R 如果我们要研究一个连续变量的分布,直方图是最佳的选择。 1、base绘图 在base中可以使用hist函数绘制直方图,与plot函数一样,它没有data参数,须把数据框置于with中。 data(obama_vs_mccain,package&q…...
第4节:Python编程基础 - Python语法快速回顾
1. Python简介与环境配置 Python是一种高级、解释型、通用的编程语言,由Guido van Rossum于1991年首次发布。 它以简洁明了的语法和强大的功能而闻名,广泛应用于Web开发、数据分析、人工智能、科学计算等领域。 1.1 Python的特点 简单易学:…...
十四、C++速通秘籍—函数式编程
目录 上一章节: 一、引言 一、函数式编程基础 三、Lambda 表达式 作用: Lambda 表达式捕获值的方式: 注意: 四、函数对象 函数对象与普通函数对比: 五、函数适配器 1、适配普通函数 2、适配 Lambda 表达式 …...
蓝桥杯 2025 C++组 省 B 题解
可分解的正整数 算法:思维 因为可以有负数 所以除了1以外的任何数都可以构造 当这个数为x构造方法为 -(x-1) -(x-2) -(x-3) ....-1 0 1...x-3 x-2 x-1 x 除了x,x以前的数都会被负数抵消 #include <bits/stdc.h> #define ll long long ll a…...
如何让老电脑运行快些(极限榨干老电脑硬件)
要让老电脑运行更快,可以通过增加虚拟内存、优化系统设置和硬件升级等方法实现。以下是具体建议: 1. 增加虚拟内存(适合硬盘空间大的老电脑) 虚拟内存(页面文件)是硬盘上的一部分空间,用于扩展…...
博物馆小程序怎么做?从0到1打造数字化文化窗口
博物馆小程序怎么做?从0到1打造数字化文化窗口 一、行业痛点:传统博物馆的数字化困局 在数字化浪潮下,传统博物馆普遍面临三大挑战: 客流受限:线下接待能力有限,难以触达更广泛人群 互动单一…...
信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G
【题目链接】 ybt 1498:Roadblocks 洛谷 P2865 [USACO06NOV] Roadblocks G 【题目考点】 1. 图论:严格次短路径 严格次短路的路径长度必须大于最短路的路径长度。 非严格次短路的路径长度大于等于最短路的路径长度。 【解题思路】 每个交叉路口是一…...
1.5-APP的架构\微信小程序的架构
1.5-APP的架构\微信小程序的架构 APP的三种开发架构: 原生态APP类型 APP-开发架构-原生态-IDEA 演示:remusic项目源码 NP管理器: http://normalplayer.top/ HttpCanary:https://github.com/mingww64/HttpCanary-SSL-Magisk 安全影…...
【服务器端表单字符验证】
文章目录 一、实验目的二、核心代码实现三、调试关键问题四、总结 一、实验目的 掌握JSP表单验证在服务器端的实现技术,实现对用户输入字符的非空及长度为5的验证,返回对应提示信息并优化用户交互。 二、核心代码实现 前端表单 <form action"…...
【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
本文基于之前的一个旅游网站,实现 Django 连接 vue3,使 vue3 能携带 CSRF Token 发送 axios 请求给后端,后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token ? CSRF攻击的…...
react中通过 EventEmitter 在组件间传递状态
要在 Reply 组件中通过 statusChangeEvent 发送状态值,并在 Select 组件中接收这个状态值 status,你可以按照以下步骤实现: //Event.jsimport EventEmitter from events;export const statusChangeEvent new EventEmitter();// 工单状态切换…...
数据库实验:分组查询与聚集函数的使用
目录 引言一、GROUP BY核心规则与常见错误二、高级分组选项:ROLLUP、CUBE与GROUPING SETS三、窗口函数:在原始行中显示分组聚合结果四、UNION ALL合并结果集:解决冗余查询问题五、实验体会 结语 (附上实验中表格的信息)…...
【mllm】——x64模拟htp的后端无法编译debug
mllm, qnn, x64 code:https://github.com/UbiquitousLearning/mllm 1. 问题 通过自定义qualcomm graph使用高通的htp后端进行llm推理,网络暂时只有mllm,和https://github.com/chraac/llama.cpp。qualcomm是支持x64模拟htp推理的,这样比较好d…...
计算机网络- UDP协议详解
UDP协议详解 5. UDP协议详解5.1 UDP协议基础5.1.1 UDP的基本概念5.1.2 UDP报文结构5.1.3 UDP校验和计算5.1.4 UDP在Linux内核中的实现UDP套接字的创建UDP数据的发送UDP数据的接收UDP校验和的计算 5.1.5 UDP的实际应用音视频流媒体在线游戏DNS查询VoIP通信网络时间同步 5.2 UDP编…...
Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据
前言 本来针对Open-TeleVision的源码解析,是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发》中的,但考虑到为避免篇幅过长,故独立成此文 第一部分 Open-TeleVision的源码解析 如本…...
Embedding质量评估、空间塌缩、 Alignment Uniformity
Embedding质量的评估和空间塌缩的解决是自然语言处理(NLP)和推荐系统领域的关键问题。以下是综合多篇研究的总结: 一、Embedding质量评估方法 基准测试与任务指标 MTEB/C-MTEB:使用多语言或中文的基准测试集(如58个数据…...
[题解] Educational Codeforces Round 168 (Rated for Div. 2) E - level up
链接 思路 1 注意到在 k ∈ [ 1 , n ] k \in [1,n] k∈[1,n] 可以得到的最高等级分别为: n , n 2 , n 3 . . . . . n n n,\frac{n}{2},\frac{n}{3}.....\frac{n}{n} n,2n,3n.....nn, 总的个数是一个调和级数, s u m n ∗ ln n sumn*\ln n sumn∗lnn, 完全可以处…...
Lua 中的 table 类型详解
Lua 中的 table 类型详解 table 是 Lua 中唯一的数据结构机制,它实现了关联数组的功能,可以用来表示普通数组、序列、符号表、集合、记录、图、树等几乎所有数据结构。 基本特性 table 是 Lua 中唯一的数据结构类型可以包含任意类型的值(n…...
github进阶使用教程
目录索引 一、基本内容 repository fork star codespaces issue 在一个仓库创建话题讨论,可以由仓库主人选择开始和结束话题的讨论 pull request(也称 pr) 协同其他仓库开发,请求仓库主人拉取自己的代码合并到仓库的主分支&…...
推流265视频,网页如何支持显示265的webrtc
科技发展真快,以前在网页上(一般指谷歌浏览器),要显示265的视频流,都是很鸡肋的办法,要么转码,要么用很慢的hls,体验非常不好,而今谷歌官方最新的浏览器已经支持265的web…...
