全网最详细!!!Django 从入门到实战:环境搭建、配置与模型开发全指南

引路者👇:

第一章:Django 框架基础与环境搭建

1.1 认识 Django:MTV 架构与核心特点

1.2 搭建 Django 开发环境(Windows/macOS 通用)

1.2.1 前提:安装 Python 环境

1.2.2 安装 Django 与依赖工具

步骤 1:创建虚拟环境(推荐)

步骤 2:安装 Django 与数据库驱动

1.2.3 两种方式创建第一个 Django 项目

方式 1:命令行创建(适合所有系统)

方式 2:PyCharm 创建(可视化操作,适合新手)

1.2.4 项目目录结构解析

1.3 开发第一个 Django 应用:Hello World

步骤 1:编写视图函数(myapp/views.py)

步骤 2:配置应用级 URL(myapp/urls.py)

步骤 3:配置根级 URL(mysite/urls.py)

步骤 4:测试访问

第二章:Django 核心配置(settings.py 详解)

2.1 基础路径配置:BASE_DIR

2.2 启动模式与访问权限:DEBUG 与 ALLOWED_HOSTS

2.2.1 DEBUG 模式(开发 / 生产环境切换)

2.2.2 ALLOWED_HOSTS(站点访问白名单)

2.3 应用注册:INSTALLED_APPS

2.4 数据库配置:DATABASES

2.4.1 默认 SQLite 配置(开发环境用)

2.4.2 MySQL 配置(生产环境推荐)

步骤 1:提前准备

步骤 2:修改 settings.py

步骤 3:适配 pymysql(若使用该驱动)

2.5 模板配置:TEMPLATES

2.6 静态文件配置:图片、CSS、JS

静态文件使用示例

2.7 语言与时区配置:支持中文与本地时间

第三章:Django 模型开发:ORM 与数据库交互

3.1 模型基础:定义第一个模型

3.1.1 模型定义规则

3.1.2 示例:定义 “图书” 模型(myapp/models.py)

3.2 核心:Django 字段类型与选项

3.2.1 常用字段类型(覆盖 90% 开发场景)

3.2.2 常用字段选项(控制字段行为)

3.3 模型关联关系:外键、一对一、多对多

3.3.1 一对多关系(ForeignKey)

3.3.2 一对一关系(OneToOneField)

3.3.3 多对多关系(ManyToManyField)

3.4 数据库迁移:将模型同步到数据库

迁移的核心命令(终端执行)

3.5 模型的属性与方法:增强业务逻辑

3.5.1 示例 1:计算图书折扣价格

3.5.2 示例 2:重写模型的 save 方法

第四章:Django 管理后台:自动化数据管理

4.1 注册模型到管理后台

4.2 访问管理后台

第五章:总结


引言:

        在 Web 开发领域,Django 凭借 “开箱即用” 的特性,成为 Python 开发者构建高效、安全 Web 应用的首选框架。它封装了数据库操作、用户认证、URL 路由等核心功能,让开发者无需重复造轮子,专注于业务逻辑实现。本文基于 Django 官方最佳实践与实战教案,从环境搭建到模型开发,Fly带您系统掌握 Django 的核心技能,零基础也能快速上手。

第一章:Django 框架基础与环境搭建

1.1 认识 Django:MTV 架构与核心特点

Django 遵循MTV(模型 - 模板 - 视图)架构,是 MVC 模式的优化版本,各组件职责清晰,实现松耦合开发:

  • 模型(Model):数据存取层,负责与数据库交互,定义数据结构与验证规则(如用户表、商品表),通过 ORM(对象关系映射)简化 SQL 操作。
  • 模板(Template):表现层,负责 HTML 页面渲染,支持模板继承、变量渲染等功能,将数据以友好的形式展示给用户。
  • 视图(View):业务逻辑层,接收 HTTP 请求,调用模型处理数据,再将结果传递给模板,是连接模型与模板的桥梁。
  • URL 分发器:额外的 “控制器” 角色,通过正则表达式匹配 URL,将请求分发到对应的视图函数,实现路由灵活配置。

Django 的核心优势在于 “全功能覆盖”,无需整合第三方工具即可满足大多数 Web 开发需求:

  • 内置 ORM 系统,支持 MySQL、SQLite、PostgreSQL 等多种数据库;
  • 自动化管理后台,仅需几行代码即可生成数据管理界面;
  • 完善的安全机制,自动防御 SQL 注入、XSS、CSRF 等攻击;
  • 支持国际化、缓存、表单验证等企业级功能;
  • 灵活的路由系统与模板引擎,降低开发复杂度。

1.2 搭建 Django 开发环境(Windows/macOS 通用)

1.2.1 前提:安装 Python 环境

Django 5.2(LTS 长期支持版)要求 Python 3.8 及以上版本,安装步骤如下:

  1. 访问Python 官网,下载对应系统的 Python 安装包(推荐 3.11 版本);
  2. 运行安装程序,务必勾选 “Add Python to PATH”(避免手动配置环境变量);
  3. 验证安装:打开终端 / 命令提示符,输入以下命令,显示版本号即成功:

    bash

    python --version  # Windows
    python3 --version  # macOS/Linux
    # 输出示例:Python 3.11.9
    

1.2.2 安装 Django 与依赖工具

步骤 1:创建虚拟环境(推荐)

        虚拟环境可隔离不同项目的依赖,避免版本冲突,命令如下:

# 1. 创建项目目录(示例:django_project)
mkdir django_project && cd django_project

# 2. 创建虚拟环境(venv为环境名,可自定义)
python -m venv venv  # Windows/macOS/Linux

# 3. 激活虚拟环境
# Windows(命令提示符)
venv\Scripts\activate
# Windows(PowerShell)
.\venv\Scripts\Activate.ps1
# macOS/Linux
source venv/bin/activate

# 激活成功后,终端前缀会显示(venv)
步骤 2:安装 Django 与数据库驱动
# 安装Django 5.2.5(LTS版,稳定性强)
pip install Django==5.2.5

# 安装MySQL驱动(后续连接MySQL需用到,二选一)
pip install mysqlclient  # 官方推荐,性能好
# 或(若mysqlclient安装失败,用pymysql)
pip install pymysql

# 验证Django安装
django-admin --version
# 输出示例:django-admin 5.2.5

1.2.3 两种方式创建第一个 Django 项目

方式 1:命令行创建(适合所有系统)
# 1. 创建项目(mysite为项目名,可自定义)
django-admin startproject mysite

# 2. 进入项目目录
cd mysite

# 3. 创建应用(App,如myapp,代表一个功能模块)
python manage.py startapp myapp

# 4. 启动开发服务器
python manage.py runserver
# 输出“Starting development server at http://127.0.0.1:8000/”即成功
方式 2:PyCharm 创建(可视化操作,适合新手)
  1. 打开 PyCharm,点击 “New Project”,左侧选择 “Django”;
  2. 配置项目信息:
    • Name:项目名(如 mysite);
    • Location:项目保存路径;
    • Interpreter:选择之前创建的虚拟环境(venv 目录下的 python.exe);
  3. 点击 “Create”,PyCharm 会自动初始化项目结构,包括:
    • templates目录(存放 HTML 模板,命令行创建需手动添加);
    • 自动配置settings.py中的模板路径(DIRS: [BASE_DIR / 'templates']);
  4. 启动服务器:点击 PyCharm 右上角的 “Run” 按钮,或执行python manage.py runserver

1.2.4 项目目录结构解析

        创建项目后,核心文件 / 目录的作用如下:

mysite/  # 项目根目录
├── manage.py  # 项目管理工具(启动服务器、创建App、数据库迁移等)
├── mysite/  # 项目核心配置目录
│   ├── __init__.py  # 初始化文件,标识为Python包
│   ├── settings.py  # 全局配置文件(数据库、中间件、静态文件等)
│   ├── urls.py      # 根级URL配置,分发所有请求
│   ├── asgi.py      # ASGI异步网关接口(部署用,无需修改)
│   └── wsgi.py      # WSGI网关接口(部署用,无需修改)
├── myapp/  # 自定义应用目录
│   ├── migrations/  # 数据库迁移文件(自动生成)
│   ├── __init__.py
│   ├── admin.py     # 管理后台配置(注册模型)
│   ├── apps.py      # App配置(如应用名)
│   ├── models.py    # 模型定义(核心!数据结构)
│   ├── tests.py     # 单元测试
│   ├── urls.py      # 应用级URL配置(推荐拆分,避免根路由臃肿)
│   └── views.py     # 视图函数(业务逻辑)
└── templates/  # 模板目录(存放HTML文件)

1.3 开发第一个 Django 应用:Hello World

步骤 1:编写视图函数(myapp/views.py)

        视图函数接收 HTTP 请求,返回响应,代码如下:

# myapp/views.py
from django.http import HttpResponse

def home(request):
    """
    处理/home/路径的请求,返回Hello Django响应
    :param request: HTTP请求对象(包含客户端信息)
    :return: HttpResponse:HTTP响应对象
    """
    return HttpResponse("Hello, Django 5! 这是我的第一个Django应用")

步骤 2:配置应用级 URL(myapp/urls.py)

        创建myapp/urls.py文件,定义应用内的路由规则:

# myapp/urls.py
from django.urls import path
from . import views  # 导入当前应用的views.py

# URL路由列表:path(路径, 视图函数, 别名)
urlpatterns = [
    path('home/', views.home, name='home'),  # /myapp/home/ 映射到home视图
]

步骤 3:配置根级 URL(mysite/urls.py)

        将应用的 URL 挂载到项目根路由,让 Django 能找到应用的视图:

# mysite/urls.py
from django.contrib import admin
from django.urls import path, include  # 导入include用于包含应用URL

urlpatterns = [
    path('admin/', admin.site.urls),  # 管理后台路由(默认)
    # 将/myapp/路径下的所有请求,转发到myapp/urls.py处理
    path('myapp/', include('myapp.urls')),
]

步骤 4:测试访问

        启动开发服务器后,打开浏览器访问:http://127.0.0.1:8000/myapp/home/,页面将显示 “Hello, Django 5! 这是我的第一个 Django 应用”,表示应用开发成功。

第二章:Django 核心配置(settings.py 详解)

        Django 的所有配置都集中在settings.py文件中,掌握关键配置项是项目稳定运行的基础。以下是开发中最常用的配置模块:

2.1 基础路径配置:BASE_DIR

   BASE_DIR是项目的绝对路径,动态计算生成,所有文件路径(如模板、静态文件)都应基于此路径,避免硬编码:

# settings.py
from pathlib import Path

# 项目根目录:当前文件(settings.py)的父目录的父目录
BASE_DIR = Path(__file__).resolve().parent.parent

用途:后续配置模板目录、静态文件目录时,需用到BASE_DIR,例如BASE_DIR / 'templates'

2.2 启动模式与访问权限:DEBUG 与 ALLOWED_HOSTS

2.2.1 DEBUG 模式(开发 / 生产环境切换)

  • DEBUG = True:开发环境,开启调试模式,代码修改后自动重启服务器,报错时显示详细堆栈信息;
  • DEBUG = False:生产环境,关闭调试模式,报错时返回简洁的 404/500 页面,避免泄露代码信息。

注意:生产环境必须设置DEBUG = False,否则存在安全风险!

2.2.2 ALLOWED_HOSTS(站点访问白名单)

        控制哪些域名 / IP 可以访问项目,防止恶意请求:

# settings.py
# 开发环境:允许本地访问(127.0.0.1、localhost)
ALLOWED_HOSTS = []

# 生产环境:指定允许的域名(如自己的网站域名)
# ALLOWED_HOSTS = ['www.mydjango.com', 'mydjango.com']

# 测试环境:允许所有IP访问(不推荐生产使用)
# ALLOWED_HOSTS = ['*']

        若需局域网内其他设备访问,启动服务器时需指定 IP:

python manage.py runserver 0.0.0.0:8000

2.3 应用注册:INSTALLED_APPS

        所有自定义或第三方应用,必须在INSTALLED_APPS中注册,Django 才会加载其功能(如模型、模板、路由):

# settings.py
INSTALLED_APPS = [
    # Django内置应用(无需修改)
    'django.contrib.admin',    # 管理后台
    'django.contrib.auth',     # 用户认证
    'django.contrib.contenttypes',  # 内容类型
    'django.contrib.sessions', # 会话管理
    'django.contrib.messages', # 消息提示
    'django.contrib.staticfiles', # 静态文件管理
    
    # 自定义应用(需手动添加,如myapp、blog)
    'myapp',
    'blog',  # 示例:后续创建的博客应用
]

注册流程:创建 App 后(python manage.py startapp blog),在INSTALLED_APPS中添加 App 名即可。

2.4 数据库配置:DATABASES

        Django 默认使用 SQLite(无需额外配置),但生产环境通常使用 MySQL。以下是两种数据库的配置示例:

2.4.1 默认 SQLite 配置(开发环境用)

# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',  # 数据库引擎
        'NAME': BASE_DIR / 'db.sqlite3',  # 数据库文件路径(项目根目录下)
    }
}

2.4.2 MySQL 配置(生产环境推荐)

步骤 1:提前准备
  1. 安装 MySQL 数据库(本地或远程),创建数据库(如django_db);
  2. 确保已安装 MySQL 驱动(mysqlclientpymysql)。
步骤 2:修改 settings.py
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # MySQL引擎
        'NAME': 'django_db',  # 数据库名(需提前创建)
        'USER': 'root',       # MySQL用户名(如root)
        'PASSWORD': '123456', # MySQL密码(根据实际情况修改)
        'HOST': 'localhost',  # 数据库地址(本地为localhost,远程填IP)
        'PORT': '3306',       # 数据库端口(默认3306)
        'OPTIONS': {
            'charset': 'utf8mb4',  # 支持emoji表情
        }
    }
}
步骤 3:适配 pymysql(若使用该驱动)

若安装的是pymysql,需在项目根目录的__init__.py中添加适配代码:

# mysite/__init__.py
import pymysql
pymysql.install_as_MySQLdb()

2.5 模板配置:TEMPLATES

        模板用于存放 HTML 文件,Django 通过TEMPLATES配置模板引擎与搜索路径:

# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',  # Django模板引擎
        'DIRS': [BASE_DIR / 'templates'],  # 全局模板目录(项目根目录下的templates)
        'APP_DIRS': True,  # 是否搜索各App下的templates目录
        'OPTIONS': {
            'context_processors': [
                # 模板上下文处理器:向所有模板注入默认变量
                'django.template.context_processors.debug',
                'django.template.context_processors.request',  # 注入request对象(模板中可直接用)
                'django.contrib.auth.context_processors.auth',  # 注入用户认证信息
                'django.contrib.messages.context_processors.messages',  # 注入消息提示
            ],
        },
    },
]

模板使用优先级DIRS(全局模板) > APP_DIRS(App 内模板),例如若全局模板与 App 模板有同名文件,优先使用全局模板。

2.6 静态文件配置:图片、CSS、JS

        静态文件(CSS、JS、图片、视频)需通过STATIC相关配置指定路径,确保模板能正确加载:

# settings.py
# 静态文件URL前缀:模板中通过{% static '路径' %}引用
STATIC_URL = 'static/'

# 开发环境静态文件目录:项目根目录下的static文件夹
STATICFILES_DIRS = [
    BASE_DIR / 'static',
]

# 生产环境静态文件收集目录:执行collectstatic命令后,静态文件会集中到这里
STATIC_ROOT = BASE_DIR / 'staticfiles'

静态文件使用示例

  1. 在项目根目录创建static目录,再创建css子目录,放入style.css文件;
  2. 在模板中引用静态文件(需先加载static标签):
<!-- templates/home.html -->
{% load static %}  <!-- 加载静态文件标签 -->
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="{% static 'css/style.css' %}">  <!-- 引用CSS -->
</head>
<body>
    <img src="{% static 'images/logo.png' %}" alt="Logo">  <!-- 引用图片 -->
</body>
</html>
  1. 生产环境部署前,执行以下命令收集静态文件:
python manage.py collectstatic

2.7 语言与时区配置:支持中文与本地时间

        默认情况下,Django 使用英文与 UTC 时区,修改为中文与上海时区:

# settings.py
# 语言配置:中文(简体)
LANGUAGE_CODE = 'zh-hans'

# 时区配置:亚洲/上海(UTC+8)
TIME_ZONE = 'Asia/Shanghai'

# 是否使用时区感知的datetime对象(推荐True)
USE_TZ = True

# (可选)指定翻译文件目录
LOCALE_PATHS = [BASE_DIR / 'locale']

        修改后,管理后台、报错信息等会自动显示为中文,时间也会同步本地时区。

第三章:Django 模型开发:ORM 与数据库交互

        模型是 Django 与数据库交互的核心,通过 Python 类定义数据结构,无需手动编写 SQL。本节将详细讲解模型的定义、字段类型、关联关系与数据库迁移。

3.1 模型基础:定义第一个模型

3.1.1 模型定义规则

  • 模型类必须继承自django.db.models.Model
  • 每个类属性对应数据库表的一个字段;
  • 字段类型需指定(如字符串、整数、日期),并配置字段选项(如最大长度、默认值)。

3.1.2 示例:定义 “图书” 模型(myapp/models.py)

# myapp/models.py
from django.db import models

class Book(models.Model):
    """
    图书模型:存储图书的基本信息
    """
    # 图书标题:字符串类型,最大长度200,非空
    title = models.CharField(max_length=200, verbose_name="图书标题")
    # 作者:字符串类型,最大长度100,非空
    author = models.CharField(max_length=100, verbose_name="作者")
    # 出版日期:日期类型,允许为空(部分图书可能无出版日期)
    publication_date = models.DateField(null=True, blank=True, verbose_name="出版日期")
    # 价格:十进制类型,最大5位数字,小数点后2位(如99.99)
    price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="价格")
    # 创建时间:自动记录创建时的时间(仅第一次保存时设置)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    # 更新时间:自动记录更新时的时间(每次保存都会更新)
    updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")

    def __str__(self):
        """
        定义模型对象的字符串表示:在管理后台或终端中显示图书标题
        """
        return self.title

    class Meta:
        """
        模型元数据:配置表名、排序、显示名称等
        """
        db_table = "books"  # 数据库表名(默认是“应用名_模型名”,如myapp_book)
        verbose_name = "图书"  # 单数显示名称(管理后台用)
        verbose_name_plural = "图书"  # 复数显示名称(管理后台用)
        ordering = ["-created_at"]  # 默认排序:按创建时间降序(最新的在前)

3.2 核心:Django 字段类型与选项

3.2.1 常用字段类型(覆盖 90% 开发场景)

字段类型用途说明示例代码
CharField短字符串(如姓名、标题),需指定max_lengthname = models.CharField(max_length=100)
TextField长文本(如文章内容、简介)content = models.TextField()
IntegerField整数(如年龄、数量)age = models.IntegerField()
DecimalField精确小数(如价格、金额),需指定max_digits(总位数)和decimal_places(小数位数)price = models.DecimalField(max_digits=5, decimal_places=2)
DateField日期(如生日、出版日期)birth_date = models.DateField()
DateTimeField日期时间(如创建时间、更新时间)created_at = models.DateTimeField(auto_now_add=True)
BooleanField布尔值(如是否激活、是否推荐)is_active = models.BooleanField(default=True)
EmailField邮箱地址(自动验证格式)email = models.EmailField(unique=True)
ImageField图片文件(需安装Pillow库)avatar = models.ImageField(upload_to='avatars/')

3.2.2 常用字段选项(控制字段行为)

选项名用途说明示例代码
max_lengthCharField用,指定最大长度title = models.CharField(max_length=200)
default字段默认值is_active = models.BooleanField(default=True)
null数据库中是否允许为 NULL(默认 False)publication_date = models.DateField(null=True)
blank表单提交时是否允许为空(默认 False,与null独立)bio = models.TextField(blank=True)
unique字段值是否唯一(如邮箱、用户名)email = models.EmailField(unique=True)
db_index是否为该字段创建数据库索引(提升查询速度)title = models.CharField(max_length=200, db_index=True)
verbose_name字段的可读名称(管理后台显示中文)author = models.CharField(max_length=100, verbose_name="作者")

3.3 模型关联关系:外键、一对一、多对多

        实际开发中,表与表之间通常存在关联(如 “作者 - 图书”“用户 - 订单”),Django 提供三种核心关联字段:

3.3.1 一对多关系(ForeignKey)

        最常用的关联类型,如 “一个作者可以有多本图书,一本图书只能属于一个作者”。示例:给Book模型添加作者外键:

# myapp/models.py
class Author(models.Model):
    """作者模型"""
    name = models.CharField(max_length=100, verbose_name="作者姓名")
    email = models.EmailField(unique=True, verbose_name="作者邮箱")

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "作者"
        verbose_name_plural = "作者"

class Book(models.Model):
    # 外键关联Author模型:on_delete指定关联对象删除时的行为
    author = models.ForeignKey(
        Author, 
        on_delete=models.CASCADE,  # 作者删除时,关联的图书也删除(级联删除)
        related_name="books",  # 反向查询名称:author.books.all()获取该作者的所有图书
        verbose_name="作者"
    )
    # 其他字段...(title、price等,同上)

on_delete关键选项说明:

  • CASCADE:关联对象删除时,级联删除当前对象(如删除作者,删除其所有图书);
  • PROTECT:阻止删除关联对象(如作者有图书时,无法删除作者);
  • SET_NULL:关联对象删除时,当前字段设为 NULL(需配合null=True);
  • SET_DEFAULT:关联对象删除时,当前字段设为默认值(需配合default);
  • DO_NOTHING:不做任何操作(不推荐,可能导致数据不一致)。

3.3.2 一对一关系(OneToOneField)

        适用于 “两个表一一对应” 的场景,如 “一个用户只有一个个人资料,一个个人资料只属于一个用户”。示例:用户资料模型:

# myapp/models.py
from django.contrib.auth.models import User  # 导入Django内置用户模型

class UserProfile(models.Model):
    """用户资料模型:与User一对一关联"""
    user = models.OneToOneField(
        User,  # 关联Django内置User模型
        on_delete=models.CASCADE,  # 用户删除时,资料也删除
        verbose_name="关联用户"
    )
    bio = models.TextField(blank=True, verbose_name="个人简介")
    avatar = models.ImageField(upload_to="avatars/", null=True, blank=True, verbose_name="头像")

    def __str__(self):
        return f"{self.user.username}的资料"

3.3.3 多对多关系(ManyToManyField)

        适用于 “两个表多对多关联” 的场景,如 “一篇文章可以有多个标签,一个标签可以对应多篇文章”。示例:文章与标签模型:

# myapp/models.py
class Tag(models.Model):
    """标签模型"""
    name = models.CharField(max_length=50, unique=True, verbose_name="标签名")

    def __str__(self):
        return self.name

class Article(models.Model):
    """文章模型:与Tag多对多关联"""
    title = models.CharField(max_length=200, verbose_name="文章标题")
    content = models.TextField(verbose_name="文章内容")
    # 多对多关联Tag模型:Django自动创建中间表(article_tag)
    tags = models.ManyToManyField(
        Tag, 
        related_name="articles",  # 反向查询:tag.articles.all()获取该标签的所有文章
        verbose_name="标签"
    )

    def __str__(self):
        return self.title

3.4 数据库迁移:将模型同步到数据库

        定义好模型后,需通过 “迁移” 操作将模型转换为数据库表,Django 会自动生成 SQL 语句,无需手动编写。

迁移的核心命令(终端执行)

  1. 生成迁移文件:根据模型变化,生成迁移脚本(存放在migrations目录下):

    python manage.py makemigrations myapp  # 为myapp应用生成迁移文件
    # 或(为所有应用生成)
    python manage.py makemigrations
    

    执行后会生成类似0001_initial.py的文件,记录模型的字段与关联关系。

  2. 应用迁移:执行迁移文件,在数据库中创建 / 更新表结构:

    python manage.py migrate myapp  # 仅应用myapp的迁移
    # 或(应用所有迁移)
    python manage.py migrate
    

    执行成功后,查看数据库(如 MySQL 的django_db库),会发现booksauthorarticle等表已创建。

  3. 查看迁移状态:检查哪些迁移已执行,哪些未执行:

    python manage.py showmigrations
    
  4. 回滚迁移:若迁移错误,可回滚到指定版本(需先查看迁移历史):

    # 回滚到上一个版本
    python manage.py migrate myapp 0001
    

3.5 模型的属性与方法:增强业务逻辑

        除了字段定义,还可以在模型中添加属性与方法,实现业务逻辑(如计算折扣价格、判断数据状态)。

3.5.1 示例 1:计算图书折扣价格

class Book(models.Model):
    # 字段定义...(title、price等)

    def get_discount_price(self, discount=10):
        """
        计算折扣价格:默认10%折扣
        :param discount: 折扣百分比(如10表示9折)
        :return: 折扣后的价格(Decimal类型)
        """
        if discount < 0 or discount > 100:
            raise ValueError("折扣百分比必须在0-100之间")
        return self.price * (1 - discount / 100)

    @property  # 装饰器:将方法转为属性,可直接通过book.is_expensive访问
    def is_expensive(self):
        """判断图书是否昂贵(价格>100元为昂贵)"""
        return self.price > 100

使用示例

# 在视图或shell中调用
book = Book.objects.get(title="Django 5实战")
print(book.get_discount_price(20))  # 输出8折后的价格(如99.99*0.8=79.99)
print(book.is_expensive)  # 输出True/False(取决于price是否>100)

3.5.2 示例 2:重写模型的 save 方法

        默认的save()方法仅保存数据,可重写该方法实现自定义逻辑(如数据预处理、日志记录):

class Book(models.Model):
    # 字段定义...

    def save(self, *args, **kwargs):
        """重写save方法:保存前将标题首字母大写"""
        # 自定义逻辑:标题首字母大写(如“django”→“Django”)
        self.title = self.title.title()
        # 调用父类的save方法,确保数据正常保存
        super().save(*args, **kwargs)
        # (可选)添加日志记录
        print(f"图书《{self.title}》已保存/更新")

第四章:Django 管理后台:自动化数据管理

        Django 最强大的功能之一是自动化管理后台,仅需注册模型,即可生成 CRUD(创建、读取、更新、删除)界面,无需编写前端代码。

4.1 注册模型到管理后台

在应用的admin.py中注册模型,示例如下:

# myapp/admin.py
from django.contrib import admin
from .models import Book, Author, Article, Tag

# 1. 基础注册:使用默认管理界面
admin.site.register(Author)
admin.site.register(Tag)

# 2. 自定义管理界面(推荐):通过ModelAdmin类配置显示字段、搜索、过滤等
@admin.register(Book)  # 装饰器注册,等同于admin.site.register(Book, BookAdmin)
class BookAdmin(admin.ModelAdmin):
    # 列表页显示的字段
    list_display = ["title", "author", "price", "publication_date", "is_expensive"]
    # 可搜索的字段(模糊匹配)
    search_fields = ["title", "author__name"]  # 支持关联字段(author__name表示作者姓名)
    # 过滤条件(右侧边栏)
    list_filter = ["publication_date", "author"]
    # 排序字段(默认按创建时间降序,这里追加价格排序)
    ordering = ["-created_at", "-price"]
    # 详情页字段分组(默认所有字段显示在一个组中)
    fieldsets = [
        ("基本信息", {"fields": ["title", "author", "price"]}),
        ("时间信息", {"fields": ["publication_date", "created_at", "updated_at"], "classes": ["collapse"]}),
    ]
    # 只读字段(如创建时间、更新时间,不允许编辑)
    readonly_fields = ["created_at", "updated_at"]

# 3. 注册Article模型,支持Inline编辑(编辑文章时同时编辑标签)
class ArticleTagInline(admin.TabularInline):  # 横向显示关联数据
    model = Article.tags.through  # 多对多关系的中间表
    extra = 1  # 额外显示1个空行,用于添加新标签

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ["title", "tags_count"]  # 自定义显示“标签数量”
    inlines = [ArticleTagInline]  # 关联标签的Inline编辑

    def tags_count(self, obj):
        """自定义列表字段:显示标签数量"""
        return obj.tags.count()
    tags_count.short_description = "标签数量"  # 字段显示名称

4.2 访问管理后台

  1. 创建超级用户(管理员账号):

    python manage.py createsuperuser
    

    按提示输入用户名、邮箱、密码(密码需至少 8 位,包含字母和数字)。

  2. 启动服务器,访问http://127.0.0.1:8000/admin/,使用超级用户账号登录;

  3. 登录后即可看到已注册的模型(如 “图书”“作者”“文章”),点击即可进行数据的添加、编辑、删除操作,界面完全自动化生成。

第五章:总结

本文从环境搭建到模型开发,覆盖了 Django 的核心基础,您已掌握:

  1. Django 的 MTV 架构与环境搭建(Python 虚拟环境、Django 安装);
  2. settings.py关键配置(数据库、模板、静态文件、语言时区);
  3. 模型定义与 ORM 操作(字段类型、关联关系、数据库迁移);
  4. 自动化管理后台的配置与使用。

如果实践操作中遇到其他问题,也可以在评论区留言,Fly帮你在线答疑!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值