一、Django 基础认知
1. 框架定位
- 高级 Python Web MVC(MTV) 后端框架,内置全套工具:ORM、Admin、表单、认证、缓存、路由
- MTV 架构(Django 改良版 MVC)
- M Model:模型,数据库映射(对应 MVC Model)
- T Template:模板,前端页面(对应 MVC View)
- V View:视图,业务逻辑(对应 MVC Controller)
2. 环境与项目命令
安装
bash运行
pip install django
核心命令
bash运行
python
# 创建项目
django-admin startproject 项目名
# 创建app
python manage.py startapp 应用名
# 启动服务
python manage.py runserver
# 数据库迁移
python manage.py makemigrations # 生成迁移文件
python manage.py migrate # 执行迁移建表
# 创建管理员
python manage.py createsuperuser
# shell交互
python manage.py shell
# 静态文件收集(生产)
python manage.py collectstatic
3. 项目目录结构
项目根目录/
├── 项目名/ # 全局配置包
│ ├── __init__.py
│ ├── asgi.py # 异步部署入口
│ ├── settings.py # 全局配置(核心)
│ ├── urls.py # 总路由分发
│ └── wsgi.py # 同步部署入口
├── manage.py # 命令行工具
└── app/ # 业务应用
├── migrations/ # 迁移文件
├── __init__.py
├── admin.py # 后台管理注册模型
├── apps.py # App配置类
├── models.py # 数据库模型
├── tests.py # 单元测试
├── urls.py # 子路由(手动创建)
└── views.py # 业务视图
4. settings.py 核心配置
INSTALLED_APPS:注册内置 / 自定义 app,不注册无法使用模型、路由MIDDLEWARE:中间件执行顺序(从上到下请求,从下到上响应)ROOT_URLCONF:项目总路由文件TEMPLATES:模板存放路径、模板引擎配置DATABASES:数据库配置(SQLite/MySQL/PostgreSQL)STATIC_URL/STATIC_ROOT:静态文件(css/js/img)MEDIA_URL/MEDIA_ROOT:用户上传文件AUTH_USER_MODEL:自定义用户模型DEBUG:开发 True,生产 False;关闭后 404/500 页面生效ALLOWED_HOSTS:允许访问的域名 / IP,生产必须配置
二、Models 模型层(ORM 核心)
1. ORM 优势
不用写原生 SQL,Python 类映射数据库表,自动生成增删改查语句,兼容多数据库。
2. 常用字段类型
| 字段 | 作用 |
|---|---|
| CharField(max_length) | 短字符串,必须限制长度 |
| TextField | 长文本(文章、备注) |
| IntegerField | 整数 |
| FloatField | 浮点数 |
| DecimalField(max_digits, decimal_places) | 高精度金额 |
| BooleanField | 布尔 |
| DateField/DateTimeField | 日期 / 时间;auto_now_add创建自动存时间,auto_now每次更新自动刷新 |
| FileField/ImageField | 文件 / 图片上传,存文件路径 |
| EmailField | 邮箱校验 |
| URLField | 链接校验 |
| ForeignKey (关联模型,on_delete=) | 一对多外键 |
| OneToOneField | 一对一 |
| ManyToManyField | 多对多,自动生成中间表 |
3. 外键删除规则 on_delete
models.CASCADE:主表删除,关联数据一起删(最常用)models.PROTECT:禁止删除,有子数据时报错SET_NULL:置空,字段必须加null=TrueSET_DEFAULT:设为默认值,需定义default
4. 模型元数据 Meta
python运行
class User(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = "user_table" # 自定义数据库表名
ordering = ["-id"] # 默认排序 -倒序
verbose_name = "用户" # Admin后台显示单数名
verbose_name_plural = "用户列表" # 复数名
5. ORM 增删改查(CRUD)
新增
# 方式1
obj = User(name="张三")
obj.save()
# 方式2
User.objects.create(name="李四")
# 批量创建
User.objects.bulk_create([User(name="a"), User(name="b")])
查询
# 全部
User.objects.all()
# 精确匹配
User.objects.filter(name="张三")
# 排除
User.objects.exclude(name="张三")
# 单个对象(无数据抛异常)
User.objects.get(id=1)
# 模糊查询
filter(name__contains="张") # 包含
filter(id__gt=10) # 大于10 lt小于 gte大于等于
filter(create_time__year=2026) # 年份筛选
# 排序
all().order_by("-id")
# 切片分页
all()[0:10]
# 聚合
from django.db.models import Count, Sum
User.objects.aggregate(total=Count("id"))
# 分组
User.objects.values("name").annotate(count=Count("id"))
# 只取指定字段
values("id","name") / values_list("id")
# 存在判断
User.objects.filter(name="张三").exists()
修改
# 单条
obj = User.objects.get(id=1)
obj.name = "新名字"
obj.save()
# 批量(不用save)
User.objects.filter(id__gte=5).update(name="批量修改")
删除
# 单条
obj.delete()
# 批量
User.objects.filter(name="张三").delete()
6. 关联查询
一对多:Book (FK→Author)
# 正向(外键对象.关联属性)
book.author.name
# 反向(主表.子表_set)
author.book_set.all()
# ORM过滤跨表
Book.objects.filter(author__name="张三")
7. 迁移流程
- 修改 models 字段
makemigrations:记录变更生成迁移脚本migrate:执行 SQL 同步数据库- 迁移回滚:
migrate app名 迁移版本号
三、URLs 路由层
1. 总路由分发(项目 urls.py)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
# 分发到子应用路由
path("user/", include("user.urls")),
]
2. 子应用路由(app/urls.py)
from django.urls import path
from . import views
# 命名空间,模板反向解析用app_name:name
app_name = "user"
urlpatterns = [
# 普通路由
path("list/", views.user_list, name="user_list"),
# 路径参数捕获(int/str/slug/uuid/path)
path("detail/<int:uid>/", views.user_detail, name="user_detail"),
# 正则路由(re_path)
re_path(r"^detail/(?P<uid>\d+)/$", views.user_detail),
]
3. 反向解析(避免硬编码 url)
from django.urls import reverse
# 无参数
reverse("user:user_list")
# 传参数
reverse("user:user_detail", args=[1])
reverse("user:user_detail", kwargs={"uid":1})
模板中
<!-- 无参 -->
<a href="{% url 'user:user_list' %}">用户列表</a>
<!-- 传参 -->
<a href="{% url 'user:user_detail' obj.id %}">详情</a>
四、Views 视图层(业务逻辑)
两大类视图:函数视图 FBV / 类视图 CBV
1. FBV 函数视图(基础)
from django.shortcuts import render, HttpResponse, redirect
from django.urls import reverse
def index(request):
# request 对象属性
# request.method GET/POST
# request.GET 查询参数
# request.POST 表单提交数据
# request.FILES 上传文件
# request.user 当前登录用户
# request.session 会话
# 返回文本
return HttpResponse("首页")
# 渲染模板,传参context
return render(request, "index.html", {"name":"张三"})
# 重定向
return redirect(reverse("user:user_list"))
2. CBV 类视图(推荐,封装好复用)
from django.views import View
from django.shortcuts import render
class UserListView(View):
# get请求
def get(self, request):
users = User.objects.all()
return render(request, "user/list.html", {"users":users})
# post请求
def post(self, request):
name = request.POST.get("name")
User.objects.create(name=name)
return redirect("user:user_list")
路由注册类视图:path("list/", views.UserListView.as_view(), name="user_list")
3. 通用类视图(内置封装,少写代码)
- ListView:列表页
- DetailView:详情页
- CreateView:新增页面
- UpdateView:编辑更新
- DeleteView:删除
- TemplateView:纯静态模板页
ListView:
from django.views.generic import ListView
from .models import User
class UserList(ListView):
model = User
template_name = "user/list.html" # 模板路径
context_object_name = "user_list" # 模板接收变量名
paginate_by = 10 # 分页每页10条
4. 分页 Pagination
from django.core.paginator import Paginator
users = User.objects.all()
paginator = Paginator(users, 10)
page = paginator.get_page(request.GET.get("page", 1))
# 传给模板:page对象
# page.object_list 当前页数据
# page.has_previous() 是否上一页
# page.has_next() 是否下一页
# page.number 当前页码
# paginator.num_pages 总页数
五、Template 模板层
1. 模板语法
变量渲染 {``{ 变量 }}
{{ name }}
{{ obj.name }}
{{ list.0 }}
{{ list.0 }}
逻辑标签 {% 标签 %}
<!-- 判断 -->
{% if age > 18 %}
成年
{% elif age < 18 %}
未成年
{% endif %}
<!-- 循环 -->
{% for user in user_list %}
{{ user.name }}
{% empty %}
暂无数据
{% endfor %}
<!-- 反向url -->
{% url "user:detail" user.id %}
<!-- 静态文件 -->
{% load static %}
<img src="{% static 'img/logo.png' %}">
<!-- 模板继承 -->
{% extends "base.html" %}
{% block content %}{% endblock %}
<!-- 导入组件 -->
{% include "common/header.html" %}
2. 过滤器 |
{{ str|length }} 长度
{{ time|date:"Y-m-d H:i:s" }} 时间格式化
{{ content|safe }} 关闭转义(渲染html)
{{ num|add:10 }} 数字相加
{{ name|default:"空" }} 默认值
3. 模板继承(页面复用核心)
- 父模板 base.html 定义
block占位 - 子页面
extends继承,重写 block 内容
六、Forms 表单组件
作用:表单校验、自动生成 input 标签、错误提示、防 CSRF
1. 普通 Form
from django import forms
class UserForm(forms.Form):
name = forms.CharField(max_length=20, label="用户名")
age = forms.IntegerField(min_value=1, label="年龄")
email = forms.EmailField(label="邮箱")
# 自定义局部校验
def clean_name(self):
name = self.cleaned_data.get("name")
if len(name) < 2:
raise forms.ValidationError("用户名至少2个字")
return name
# 全局校验
def clean(self):
pass
2. ModelForm(绑定模型,自动生成字段)
class UserModelForm(forms.ModelForm):
class Meta:
model = User
fields = ["name", "age", "email"] # 展示字段
# exclude = ["id"] 排除字段
3. 视图使用表单
def add_user(request):
if request.method == "POST":
form = UserModelForm(request.POST)
if form.is_valid(): # 自动校验
form.save() # 直接入库
return redirect("list")
else:
form = UserModelForm()
return render(request, "form.html", {"form":form})
模板渲染表单 + CSRF 防护
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">提交</button>
</form>
七、Admin 后台管理系统
-
注册模型到 app/admin.py
from django.contrib import admin
from .models import User@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ["id", "name", "age"] # 列表展示字段
search_fields = ["name"] # 搜索框
list_filter = ["age"] # 右侧筛选
list_per_page = 20 # 分页
readonly_fields = ["id"] # 只读字段
fieldsets = [ # 分组编辑
("基础信息", {"fields":["name","age"]})
] -
创建超级用户
createsuperuser,访问/admin
八、认证系统 Auth
1. 内置用户模型 User
字段:username, password, email, is_active, is_staff, is_superuser
2. 常用认证方法
python
运行
from django.contrib.auth import authenticate, login, logout
# 校验账号密码
user = authenticate(username="xx", password="xx")
if user:
login(request, user) # 登录,写入session
logout(request) # 退出登录
# 登录装饰器(FBV)
from django.contrib.auth.decorators import login_required
@login_required
def center(request): pass
# CBV登录校验类
from django.contrib.auth.mixins import LoginRequiredMixin
class CenterView(LoginRequiredMixin, View): pass
# 获取当前登录用户
request.user
# 判断是否登录
request.user.is_authenticated
3. 自定义用户模型(生产必用)
python
运行
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
phone = models.CharField(max_length=11)
settings.py 添加:AUTH_USER_MODEL = "app.User"
注意:数据库迁移必须在项目初始化时配置,已建表后修改非常麻烦
九、中间件 Middleware
执行流程
请求顺序:从上到下执行process_request 响应顺序:从下到上执行process_response
自定义中间件模板
python
运行
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# 请求前执行逻辑
response = self.get_response(request)
# 响应返回前执行逻辑
return response
# 视图异常捕获
def process_exception(self, request, exception):
pass
注册到 settings MIDDLEWARE 列表
十、静态文件 & 文件上传
- 静态资源(css/js/img)
python
运行
# settings.py
STATIC_URL = "/static/"
STATICFILES_DIRS = [BASE_DIR / "static"] # 开发用
STATIC_ROOT = BASE_DIR / "static_all" # 生产collectstatic收集目录
模板加载:{% load static %} <link rel="stylesheet" href="{% static 'css/style.css' %}">
- 用户上传文件
python
运行
# settings.py
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
# 项目urls.py开放媒体文件访问
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
模型字段:avatar = models.ImageField(upload_to="avatar/", null=True)
十一、缓存 Session Cookie
1. Cookie
存客户端浏览器,明文;视图操作 request.COOKIES / response.set_cookie()
2. Session
基于 Cookie,数据存在服务端,django 默认数据库存储 session
- 写入:
request.session["key"] = value - 读取:
request.session.get("key") - 删除:
del request.session["key"] - 清空:
request.session.flush()(退出登录用)
3. 缓存(redis / 数据库 / 文件)
配置 Redis 缓存(常用),用于页面缓存、热点数据、验证码
十二、部署相关
- WSGI 同步服务器:Gunicorn + Nginx
- ASGI 异步服务:Uvicorn(Django3.2 + 支持异步视图)
- 生产关闭 DEBUG,配置 ALLOWED_HOSTS,收集静态文件,数据库使用 MySQL/PostgreSQL,禁用 sqlite
- 安全配置:CSRF、XSS 防护,HTTPS,限制数据库权限
十三、高频拓展知识点
- 异步视图:async def get (request),搭配 uvicorn
- 信号 Signal:模型保存 / 删除前后触发函数(pre_save/post_save)
- CSRF 跨站防护:模板 {% csrf_token %},Ajax 请求携带 csrf_token
- 事务:from django.db import transaction,批量操作加事务避免数据不一致
- Q/F 查询 :复杂多条件或查询
from django.db.models import Q - REST Framework DRF:Django 前后端分离标准扩展(序列化器、API 视图、分页、权限、过滤)