跳到主要内容Django Web 框架实战:从零构建产品管理系统 | 极客日志Python
Django Web 框架实战:从零构建产品管理系统
综述由AI生成Django 是 Python 生态中最成熟的 Web 框架之一,具备 ORM、模板引擎和内置安全机制。通过从零搭建一个产品管理系统,演示了项目初始化、模型定义、视图逻辑、表单处理及路由配置等核心流程。内容涵盖基础 CRUD 操作与分类管理扩展,包含用户认证与权限控制的最佳实践,适合希望快速上手 Django 全栈开发的开发者参考。
CryptoLab16 浏览 Django Web 框架实战:从零构建产品管理系统

Django 是 Python 生态中最成熟的 Web 框架之一,遵循 MTV(Model-Template-View)架构模式。它内置了 ORM、模板引擎、表单处理以及用户认证系统,能极大提升开发效率。本文将带你一步步搭建一个完整的产品管理系统,涵盖从环境配置到权限控制的核心流程。
一、环境准备与项目初始化
安装 Django
首先确保你的 Python 环境已就绪,使用 pip 安装最新稳定版:
pip install django
创建项目与应用
在终端执行以下命令初始化项目结构:
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
此时目录结构大致如下,myproject 存放全局配置,myapp 存放业务逻辑:
myproject/
├── manage.py
├── myapp/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations/
│ ├── models.py
│ ├── tests.py
│ └── views.py
└── myproject/
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
二、模型定义与数据库迁移
Django 的 ORM 让我们能用 Python 类来定义数据库表。我们先定义一个基础的产品模型:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
定义好模型后,需要生成并应用迁移文件,这相当于告诉数据库'按这个结构建表':
python manage.py makemigrations
python manage.py migrate
三、视图函数与业务逻辑
视图负责处理请求并返回响应。对于 CRUD(增删改查)操作,我们可以复用类似的逻辑结构。这里以产品列表和详情为例:
from django.shortcuts import render, get_object_or_404, redirect
from myapp.models import Product
from myapp.forms import ProductForm
def product_list(request):
products = Product.objects.all()
return render(request, 'myapp/product_list.html', {'products': products})
def product_detail(request, product_id):
product = get_object_or_404(Product, pk=product_id)
return render(request, 'myapp/product_detail.html', {'product': product})
def product_create(request):
if request.method == 'POST':
form = ProductForm(request.POST)
if form.is_valid():
form.save()
return redirect('product_list')
else:
form = ProductForm()
return render(request, 'myapp/product_form.html', {'form': form})
def product_update(request, product_id):
product = get_object_or_404(Product, pk=product_id)
if request.method == 'POST':
form = ProductForm(request.POST, instance=product)
if form.is_valid():
form.save()
return redirect('product_list')
else:
form = ProductForm(instance=product)
return render(request, 'myapp/product_form.html', {'form': form})
def product_delete(request, product_id):
product = get_object_or_404(Product, pk=product_id)
if request.method == 'POST':
product.delete()
return redirect('product_list')
return render(request, 'myapp/product_delete.html', {'product': product})
注意 get_object_or_404 的使用,它能自动处理对象不存在的情况,避免程序报错。
四、表单处理
直接操作数据库字段容易出错且不安全,Django 的 ModelForm 可以自动生成基于模型的表单,并包含验证逻辑:
from django import forms
from myapp.models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price', 'description']
五、模板渲染
模板负责展示数据。为了保持风格统一,我们通常创建一个 base.html 作为父模板,其他页面继承它。这里引入了 Bootstrap 4 来快速美化界面:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}产品管理系统{% endblock %}</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="{% url 'product_list' %}">产品管理系统</a>
<div class="collapse navbar-collapse">
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href="{% url 'product_list' %}">产品列表</a></li>
<li class="nav-item"><a class="nav-link" href="{% url 'product_create' %}">添加产品</a></li>
</ul>
</div>
</nav>
<div class="container mt-4"> {% block content %}{% endblock %} </div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
{% extends 'myapp/base.html' %}
{% block title %}产品列表{% endblock %}
{% block content %}
<h1>产品列表</h1>
<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.price }}</td>
<td>{{ product.description }}</td>
<td>{{ product.created_at }}</td>
<td>
<a href="{% url 'product_detail' product.id %}" class="btn btn-primary btn-sm">查看</a>
<a href="{% url 'product_update' product.id %}" class="btn btn-secondary btn-sm">编辑</a>
<a href="{% url 'product_delete' product.id %}" class="btn btn-danger btn-sm">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
六、路由配置
URL 映射将浏览器请求指向对应的视图函数。先在应用内定义 urls.py:
from django.urls import path
from myapp import views
urlpatterns = [
path('', views.product_list, name='product_list'),
path('product/<int:product_id>/', views.product_detail, name='product_detail'),
path('product/create/', views.product_create, name='product_create'),
path('product/<int:product_id>/update/', views.product_update, name='product_update'),
path('product/<int:product_id>/delete/', views.product_delete, name='product_delete'),
]
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
七、进阶实战:分类管理与搜索
实际项目中,产品往往需要分类管理,并且支持搜索功能。我们在模型层增加 Category 关联,并在视图中实现过滤逻辑。
1. 扩展模型
class Category(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Product(models.Model):
category = models.ForeignKey(Category, on_delete=models.CASCADE)
2. 视图增强
利用 request.GET 获取搜索参数,结合 filter 进行模糊查询:
def product_list(request):
search_query = request.GET.get('search', '')
products = Product.objects.filter(name__icontains=search_query)
return render(request, 'myapp/product_list.html', {'products': products, 'search_query': search_query})
前端模板中配合 <form method="get"> 即可实现搜索交互。
八、安全与权限管理
Django 自带强大的安全机制,如 CSRF 保护、XSS 防护等。在 settings.py 中确保中间件配置正确:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
python manage.py createsuperuser
from django.contrib import admin
from myapp.models import Product, Category
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'description', 'created_at', 'updated_at']
list_filter = ['created_at']
search_fields = ['name', 'description']
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'description', 'created_at']
对于敏感操作(如创建、删除),可以使用 @login_required 装饰器强制要求登录:
from django.contrib.auth.decorators import login_required
@login_required
def product_create(request):
九、静态文件管理
如果使用了本地 CSS 或 JS 文件,需在 settings.py 中配置:
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
模板中加载静态资源需先 {% load static %},然后使用 {% static 'path/to/file' %} 标签引用。
十、运行与调试
python manage.py runserver
访问 http://127.0.0.1:8000/ 即可查看效果。如果在开发过程中遇到报错,请检查终端输出,大多数问题源于路径配置错误或未执行迁移。记得定期提交代码到版本控制系统,防止意外丢失。
通过上述步骤,我们已经构建了一个具备基础 CRUD、分类管理、搜索及权限控制的产品管理系统。Django 的强大之处在于其'开箱即用'的特性,开发者可以将更多精力集中在业务逻辑本身,而非重复造轮子。
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online