Django 全套核心知识点(从入门到项目实战)

一、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 核心配置

  1. INSTALLED_APPS:注册内置 / 自定义 app,不注册无法使用模型、路由
  2. MIDDLEWARE:中间件执行顺序(从上到下请求,从下到上响应)
  3. ROOT_URLCONF:项目总路由文件
  4. TEMPLATES:模板存放路径、模板引擎配置
  5. DATABASES:数据库配置(SQLite/MySQL/PostgreSQL)
  6. STATIC_URL/STATIC_ROOT:静态文件(css/js/img)
  7. MEDIA_URL/MEDIA_ROOT:用户上传文件
  8. AUTH_USER_MODEL:自定义用户模型
  9. DEBUG:开发 True,生产 False;关闭后 404/500 页面生效
  10. 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=True
  • SET_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. 迁移流程

  1. 修改 models 字段
  2. makemigrations:记录变更生成迁移脚本
  3. migrate:执行 SQL 同步数据库
  4. 迁移回滚: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. 模板继承(页面复用核心)

  1. 父模板 base.html 定义block占位
  2. 子页面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 后台管理系统

  1. 注册模型到 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"]})
    ]

  2. 创建超级用户 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. 自定义用户模型(生产必用)

models.py

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 列表

十、静态文件 & 文件上传

  1. 静态资源(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' %}">

  1. 用户上传文件

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)

存客户端浏览器,明文;视图操作 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 缓存(常用),用于页面缓存、热点数据、验证码

十二、部署相关

  1. WSGI 同步服务器:Gunicorn + Nginx
  2. ASGI 异步服务:Uvicorn(Django3.2 + 支持异步视图)
  3. 生产关闭 DEBUG,配置 ALLOWED_HOSTS,收集静态文件,数据库使用 MySQL/PostgreSQL,禁用 sqlite
  4. 安全配置:CSRF、XSS 防护,HTTPS,限制数据库权限

十三、高频拓展知识点

  1. 异步视图:async def get (request),搭配 uvicorn
  2. 信号 Signal:模型保存 / 删除前后触发函数(pre_save/post_save)
  3. CSRF 跨站防护:模板 {% csrf_token %},Ajax 请求携带 csrf_token
  4. 事务:from django.db import transaction,批量操作加事务避免数据不一致
  5. Q/F 查询 :复杂多条件或查询 from django.db.models import Q
  6. REST Framework DRF:Django 前后端分离标准扩展(序列化器、API 视图、分页、权限、过滤)