一个基于Django的进销存管理系统Demo实现

news2025/4/26 13:26:26

第一步:创建 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 User

class 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.name

class 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, SaleOrder

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = '__all__'

class PurchaseForm(forms.ModelForm):
    class Meta:
        model = PurchaseOrder
        fields = ['product', 'quantity']

class SaleForm(forms.ModelForm):
    class Meta:
        model = SaleOrder
        fields = ['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, SaleForm

class ProductListView(ListView):
    model = Product
    template_name = 'erp/product_list.html'
    context_object_name = 'products'

class ProductCreateView(CreateView):
    model = Product
    form_class = ProductForm
    success_url = reverse_lazy('product_list')
    template_name = 'erp/product_form.html'

class PurchaseCreateView(CreateView):
    model = PurchaseOrder
    form_class = PurchaseForm
    success_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.user
        return super().form_valid(form)

class SaleCreateView(CreateView):
    model = SaleOrder
    form_class = SaleForm
    success_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.user
            return 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 views

urlpatterns = [
    # 商品管理
    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

系统功能扩展建议:

  1. 库存预警:在商品模型中添加预警阈值字段,并在列表页显示库存状态

  2. 报表统计:使用Chart.js生成销售趋势图

  3. 权限控制:使用Django的权限系统限制不同用户的操作权限

  4. 供应商管理:添加Supplier模型并与采购订单关联

  5. 客户管理:添加Customer模型并与销售订单关联

  6. 条码支持:集成条形码扫描功能

  7. 导入导出:使用pandas实现Excel数据导入导出

这个基础版本实现了以下核心功能:

  • 商品基本信息管理

  • 采购入库(自动增加库存)

  • 销售出库(库存校验和扣减)

  • 基本操作日志记录(操作时间和操作人)

要完善系统,还需要添加以下内容:

  1. 订单列表视图

  2. 数据验证和错误处理

  3. 分页功能

  4. 搜索和过滤功能

  5. 详细的权限管理

  6. 审计日志

  7. 数据备份和恢复功能

建议使用以下第三方库增强功能:

  • Django Filter:实现复杂数据过滤

  • Django Import Export:实现数据导入导出

  • Django Tables2:创建更强大的表格视图

  • Django Guardian:对象级权限控制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2334967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构_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)

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; 控件概述 &#x1f98b; 控件体系的发展阶段 二&#xff1a;&#x1f525; QWidget 核心属性 &#x1f98b; 核心属性概览&#x1f98b; 用件可用&#xff08…

微服务篇——SpringCloud

服务注册 Spring Cloud5大组件有哪些&#xff1f; 服务注册和发现是什么意思&#xff1f;Spring Cloud如何实现服务注册发现&#xff1f; nacos与eureka的区别 负载均衡 如何实现负载均衡&#xff1f; Ribbon负载均衡的策略有哪些&#xff1f; 如何自定义负载均衡的策略&…

如何使用PyCharm自动化测试

如何使用PyCharm自动化测试 1.打开PyCharm右击文件&#xff0c;点击新建项目 按照如图配置&#xff0c;然后点击创建 2.创建好后&#xff0c;点击文件&#xff0c;然后点击设置 按照如图步骤&#xff0c;查看selenium和webdriver-manager是否存在 3.以上都完成后按照如图创…

记一次某网络安全比赛三阶段webserver应急响应解题过程

0X01 任务说明 0X02 靶机介绍 Webserver&#xff08;Web服务器&#xff09;是一种软件或硬件设备&#xff0c;用于接收、处理并响应来自客户端&#xff08;如浏览器&#xff09;的HTTP请求&#xff0c;提供网页、图片、视频等静态或动态内容&#xff0c;是互联网基础设施的核心…

复现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…

docker部署certimateSSL证书管理自动续签

开源certimate项目地址&#xff1a;https://github.com/usual2970/certimate 官方文档地址&#xff1a;https://docs.certimate.me/docs/introduction 与certbot对比 维度CertbotCertimate安装方式通过包管理器&#xff08;如apt/yum&#xff09;安装支持二进制文件、Docker…

R语言——直方图

参考资料&#xff1a;学习R 如果我们要研究一个连续变量的分布&#xff0c;直方图是最佳的选择。 1、base绘图 在base中可以使用hist函数绘制直方图&#xff0c;与plot函数一样&#xff0c;它没有data参数&#xff0c;须把数据框置于with中。 data(obama_vs_mccain,package&q…

第4节:Python编程基础 - Python语法快速回顾

1. Python简介与环境配置 Python是一种高级、解释型、通用的编程语言&#xff0c;由Guido van Rossum于1991年首次发布。 它以简洁明了的语法和强大的功能而闻名&#xff0c;广泛应用于Web开发、数据分析、人工智能、科学计算等领域。 1.1 Python的特点 简单易学&#xff1a;…

十四、C++速通秘籍—函数式编程

目录 上一章节&#xff1a; 一、引言 一、函数式编程基础 三、Lambda 表达式 作用&#xff1a; Lambda 表达式捕获值的方式&#xff1a; 注意&#xff1a; 四、函数对象 函数对象与普通函数对比&#xff1a; 五、函数适配器 1、适配普通函数 2、适配 Lambda 表达式 …

博物馆小程序怎么做?从0到1打造数字化文化窗口

博物馆小程序怎么做&#xff1f;从0到1打造数字化文化窗口 一、行业痛点&#xff1a;传统博物馆的数字化困局 在数字化浪潮下&#xff0c;传统博物馆普遍面临三大挑战&#xff1a; ​​客流受限​​&#xff1a;线下接待能力有限&#xff0c;难以触达更广泛人群 ​​互动单一…

1.5-APP的架构\微信小程序的架构

1.5-APP的架构\微信小程序的架构 APP的三种开发架构&#xff1a; 原生态APP类型 APP-开发架构-原生态-IDEA 演示&#xff1a;remusic项目源码 NP管理器&#xff1a; http://normalplayer.top/ HttpCanary&#xff1a;https://github.com/mingww64/HttpCanary-SSL-Magisk 安全影…

【服务器端表单字符验证】

文章目录 一、实验目的二、核心代码实现三、调试关键问题四、总结 一、实验目的 掌握JSP表单验证在服务器端的实现技术&#xff0c;实现对用户输入字符的非空及长度为5的验证&#xff0c;返回对应提示信息并优化用户交互。 二、核心代码实现 前端表单 <form action"…

【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!

本文基于之前的一个旅游网站&#xff0c;实现 Django 连接 vue3&#xff0c;使 vue3 能携带 CSRF Token 发送 axios 请求给后端&#xff0c;后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token &#xff1f; CSRF攻击的…

数据库实验:分组查询与聚集函数的使用

目录 引言一、GROUP BY核心规则与常见错误二、高级分组选项&#xff1a;ROLLUP、CUBE与GROUPING SETS三、窗口函数&#xff1a;在原始行中显示分组聚合结果四、UNION ALL合并结果集&#xff1a;解决冗余查询问题五、实验体会 结语 &#xff08;附上实验中表格的信息&#xff09…

Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据

前言 本来针对Open-TeleVision的源码解析&#xff0c;是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot&#xff1a;如何基于宇树人形进行二次开发》中的&#xff0c;但考虑到为避免篇幅过长&#xff0c;故独立成此文 第一部分 Open-TeleVision的源码解析 如本…

推流265视频,网页如何支持显示265的webrtc

科技发展真快&#xff0c;以前在网页上&#xff08;一般指谷歌浏览器&#xff09;&#xff0c;要显示265的视频流&#xff0c;都是很鸡肋的办法&#xff0c;要么转码&#xff0c;要么用很慢的hls&#xff0c;体验非常不好&#xff0c;而今谷歌官方最新的浏览器已经支持265的web…

“破解”GPT-4o生图技术:万物皆可吉卜力的技术路线推测

&#x1f449;目录 1 GPT-4o 的神奇魔法 2 GPT-4o 可能的技术路线推测 3 结语 最近 GPT-4o 生图模型横空出世&#xff0c;效果和玩法上都有突破性的进展&#xff0c;笔者整理了一下目前相关的技术&#xff0c;抛砖引玉一下&#xff0c;希望有更多大神分享讨论。 图源小红书恶魔…

基于SpringBoot的电影订票系统(源码+数据库+万字文档+ppt)

504基于SpringBoot的电影订票系统&#xff0c;系统包含两种角色&#xff1a;管理员、用户主要功能如下。 【用户功能】 首页&#xff1a;浏览系统电影动态。 资讯信息&#xff1a;获取有关电影行业的新闻和资讯。 电影信息&#xff1a;查看电影的详细信息和排片情况。 公告信…

07-算法打卡-链表-移除链表-leetcode(203)-第七天

1 题目地址 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09;203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a;[https://assets.leetc…