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

相关推荐
xiaogai_gai1 小时前
钉钉通讯录与金蝶云星空无缝集成的技术实现方法
大数据·数据库·钉钉
TDengine (老段)2 小时前
TDengine 中集群维护
大数据·运维·数据库·时序数据库·tdengine·涛思数据·物联
MonKingWD2 小时前
【redis原理篇】底层数据结构
数据结构·数据库·redis
渡梦酒3 小时前
Redis批量删除Key的三种方式
数据库·redis·junit
别来无恙1494 小时前
如何用 SQL 找到最受欢迎的用户?
数据库·sql·mysql
vvilkim5 小时前
MongoDB聚合框架:大数据处理的瑞士军刀
数据库·mongodb
heart000_15 小时前
MySQL增删改查基础教程:熟练掌握DML语句操作【MySQL系列】
数据库·mysql
cici158745 小时前
粗糙表面生成程序及模拟方法
linux·前端·数据库
低代码布道师5 小时前
第七部分:第二节 - 在 Node.js 中连接和操作 MySQL:厨房与仓库的沟通渠道
数据库·mysql·node.js
小Mie不吃饭5 小时前
Redis | 缓存技术对后端的重要性
数据库·redis·缓存