一个基于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 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:对象级权限控制

相关推荐
Olrookie3 分钟前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
苏婳6665 分钟前
【最新版】怎么下载mysqlclient并成功安装?
数据库·python·mysql
Tapdata2 小时前
《实时分析市场报告 2025》上线 | 从批处理到实时洞察,2025 年全球实时分析市场全景解读
数据库
海梨花2 小时前
【从零开始学习Redis】项目实战-黑马点评D2
java·数据库·redis·后端·缓存
代码的余温3 小时前
SQL性能优化全攻略
数据库·mysql·性能优化
手把手入门6 小时前
★CentOS:MySQL数据备份
数据库·mysql·adb
SelectDB6 小时前
5000+ 中大型企业首选的 Doris,在稳定性的提升上究竟花了多大的功夫?
大数据·数据库·apache
路多辛6 小时前
Golang database/sql 包深度解析(二):连接池实现原理
数据库·sql·golang
SimonKing6 小时前
Mybatis批量插入,形式不同性能也不同
数据库·后端·程序员
杰克尼8 小时前
MYSQL-175. 组合两个表
数据库·mysql