Django Web 框架实战指南
学习目标
掌握 Django 框架的核心功能,包括模型、视图、模板、表单、认证及权限管理;理解其 MVT 架构;通过实战案例开发一个完整的产品管理系统。
Django 框架概述
什么是 Django
Django 是一个开源的 Python Web 框架,遵循 MVT(Model-View-Template)架构,提供了完整的 Web 开发解决方案,涵盖数据库操作、表单处理、用户认证等。
核心特点
- 快速开发:内置 ORM、模板引擎和表单处理,大幅减少重复代码。
- 安全性:原生支持 CSRF 保护、XSS 防护及 SQL 注入防御。
- 可扩展性:插件化设计,拥有庞大的第三方库生态。
- 文档完善:官方文档详尽,示例丰富。
安装环境
pip install django
创建项目与应用
初始化项目
使用 django-admin 创建项目骨架:
django-admin startproject myproject
cd myproject
创建应用
在项目中添加具体业务模块:
python manage.py startapp 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
模型定义与迁移
定义数据模型
在 models.py 中定义数据结构。注意类名首字母大写,字段类型需准确。
# myapp/models.py
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
视图函数实现
视图负责处理请求逻辑。我们通常使用函数视图(FBV)来演示流程。
基础 CRUD 视图
# myapp/views.py
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})
表单处理
利用 ModelForm 可以快速生成基于模型的表单,自动处理验证逻辑。
# myapp/forms.py
from django import forms
from myapp.models import Product
class ProductForm(forms.ModelForm):
class Meta:
model = Product
fields = ['name', 'price', 'description']
模板渲染
模板层负责展示。这里使用 Bootstrap 简化样式,并通过 {% extends %} 复用基础布局。
基础布局 (base.html)
<!-- myapp/templates/myapp/base.html -->
<!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>
产品列表页
<!-- myapp/templates/myapp/product_list.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 %}
路由配置
应用路由 (myapp/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'),
]
项目路由 (myproject/urls.py)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls')),
]
用户认证与权限管理
配置认证系统
确保 settings.py 中包含必要的中间件和应用:
# myproject/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
后台管理注册
# myapp/admin.py
from django.contrib import admin
from myapp.models import Product
@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
list_display = ['name', 'price', 'description', 'created_at', 'updated_at']
list_filter = ['created_at']
search_fields = ['name', 'description']
静态文件管理
配置静态文件路径
# myproject/settings.py
import os
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
模板中加载
{% load static %}
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
实战案例:产品管理系统
需求分析
构建一个支持以下功能的管理系统:
- 产品的增删改查及分类关联。
- 用户登录验证与权限控制。
- 产品名称搜索功能。
进阶模型定义
引入分类表,建立多对一关系。
# myapp/models.py
from django.db import models
from django.contrib.auth.models import User
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):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
description = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
搜索功能实现
在视图中获取查询参数,过滤结果。
# myapp/views.py
from django.shortcuts import render, get_object_or_404, redirect
from myapp.models import Product, Category
from myapp.forms import ProductForm, CategoryForm
from django.contrib.auth.decorators import login_required
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})
@login_required
def product_create(request):
# ... 省略部分代码,逻辑同上
pass
实施步骤总结
- 搭建项目与环境。
- 定义模型并迁移数据库。
- 编写视图与表单逻辑。
- 配置 URL 路由与模板。
- 启用认证与权限装饰器。
- 启动服务测试功能。
总结
本文详细介绍了 Django 框架的核心组件,从模型定义到视图逻辑,再到前端模板交互。通过产品管理系统的实战演练,展示了如何结合分类管理与搜索功能构建完整应用。建议读者在实际操作中多尝试修改代码,深入理解各模块间的协作机制。


