Python+Django官网入门示例详解与实战

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Django是一个基于Python的高级Web开发框架,以“快速、易用、强大”著称。本文通过官方示例“FirstProgram”,详细讲解了Django项目的创建流程,包括安装配置、应用生成、模型定义、数据库迁移、视图编写、URL路由配置、模板创建和服务器运行等步骤。通过该示例,开发者可以全面掌握Django的基础结构与开发模式,为构建复杂Web应用打下坚实基础。
Python+Django 官网例子

1. Django框架概述

Django 是一个高效、全功能的 Python Web 框架,旨在简化复杂网站的开发流程。它遵循“MTV”(Model-Template-View)设计模式,实现了数据模型、业务逻辑与用户界面的清晰分离。

1.1 基本概念

Django 由 Adrian Holovaty 和 Simon Willison 于 2005 年开发,最初用于新闻网站的后台系统,后于 2008 年正式开源。其核心理念是“快速开发”与“DRY(Don’t Repeat Yourself)”,适用于中大型 Web 应用程序的构建。

  • Model(模型) :负责数据的定义与操作,通常映射为数据库表结构。
  • View(视图) :处理业务逻辑,接收请求并返回响应。
  • Template(模板) :负责前端展示,将数据渲染为 HTML 页面。

这种结构使得团队协作更高效,代码复用性更强。

1.2 核心特性

Django 的核心优势在于其“开箱即用”的设计理念,主要特性包括:

特性 说明
ORM(对象关系映射) 提供 Python 风格的数据库操作接口,支持多种数据库引擎(如 PostgreSQL、MySQL、SQLite)
管理后台 自动生成基于模型的后台管理系统,极大提升内容管理效率
URL路由 灵活的 URL 映射机制,支持正则表达式与路径匹配
模板引擎 强大的模板语言,支持继承、过滤器、标签等高级功能
安全机制 内建防止 CSRF、XSS、SQL 注入等常见 Web 安全漏洞的防护机制
中间件 提供请求/响应处理的插件式架构,便于扩展系统功能

这些特性使得 Django 成为构建内容驱动型网站、企业级系统、API 服务等的理想选择。

1.3 在Web开发中的优势

相较于其他 Web 框架,Django 在以下几个方面具有显著优势:

  1. 高开发效率 :通过自动化的管理后台、ORM 和模板系统,大幅减少重复编码。
  2. 良好的社区支持 :拥有庞大的开发者社区,文档齐全,第三方插件丰富。
  3. 可扩展性强 :支持模块化开发,便于后期功能扩展与维护。
  4. 安全性强 :默认启用多种安全机制,帮助开发者避免常见漏洞。
  5. 适合大型项目 :结构清晰、组件解耦,适合中长期维护的大型系统。

因此,Django 被广泛应用于新闻网站、社交平台、电商系统、内容管理系统(CMS)等多个领域,如 Instagram、Mozilla、The Washington Post 等知名网站均采用 Django 构建其后端系统。

下一章我们将开始搭建 Django 开发环境,为实际项目开发做好准备。

2. Python与Django环境搭建

在进入Django开发之前,搭建一个稳定、隔离且高效的开发环境是至关重要的。Python与Django的环境搭建不仅包括语言本身的安装配置,还涉及虚拟环境的使用、Django框架的安装以及开发工具链的配置。本章将从基础的Python环境准备开始,逐步引导开发者完成整个环境的搭建过程。

2.1 Python开发环境准备

在开始任何Python项目之前,首先需要确保本地计算机上安装了合适的Python版本,并能够通过虚拟环境来隔离项目依赖,避免版本冲突。

2.1.1 Python版本选择与安装

Python有多个版本并存,目前主流的版本是Python 3.x。Django官方推荐使用Python 3.8及以上版本进行开发。以下是在不同操作系统上安装Python的方法:

Windows系统安装Python
  1. 访问 Python官网 下载最新稳定版本的Python安装程序。
  2. 运行下载的安装程序, 务必勾选“Add Python to PATH” ,然后点击“Install Now”。
  3. 安装完成后,打开命令提示符(CMD),输入以下命令验证安装是否成功:
python --version
macOS系统安装Python

macOS系统通常预装了Python 2.x,但我们需要使用Python 3.x。可以通过Homebrew安装:

brew install python

验证安装:

python3 --version
Linux系统安装Python(以Ubuntu为例)
sudo apt update
sudo apt install python3

验证:

python3 --version

参数说明
- --version :用于显示当前安装的Python版本。
- python / python3 :不同系统中调用Python解释器的命令可能不同。

2.1.2 虚拟环境(venv)的配置与使用

虚拟环境(Virtual Environment)可以为每个项目创建独立的Python运行环境,避免不同项目之间的依赖冲突。

创建虚拟环境

在项目目录下运行以下命令:

python -m venv env

参数说明
- -m venv :使用Python内置的venv模块创建虚拟环境。
- env :虚拟环境的目录名,可自定义。

激活虚拟环境
  • Windows
env\Scripts\activate
  • macOS / Linux
source env/bin/activate

激活后,命令行前缀会显示 (env) ,表示当前处于虚拟环境中。

安装依赖包

在虚拟环境中,可以使用 pip 安装所需的依赖包:

pip install django
退出虚拟环境
deactivate
虚拟环境使用流程图(Mermaid)
graph TD
    A[创建虚拟环境] --> B[激活虚拟环境]
    B --> C[安装依赖包]
    C --> D[开发项目]
    D --> E{是否完成?}
    E -->|是| F[退出虚拟环境]
    E -->|否| D
虚拟环境操作小结
操作 命令 说明
创建虚拟环境 python -m venv env 创建名为env的虚拟环境目录
激活环境(Win) env\Scripts\activate Windows系统下激活虚拟环境
激活环境(Unix) source env/bin/activate macOS/Linux系统下激活环境
安装依赖 pip install package_name 安装指定包
查看已安装包 pip list 查看当前环境中安装的包列表
退出环境 deactivate 退出当前激活的虚拟环境

2.2 Django的安装与验证

安装Django是搭建Web开发环境的核心步骤。Django是一个高级的Web框架,提供了一整套开发工具和组件,简化了Web应用的构建过程。

2.2.1 使用pip安装Django

在激活的虚拟环境中执行以下命令安装Django:

pip install django

参数说明
- pip :Python包管理工具,用于安装、升级和卸载Python模块。
- install django :表示安装最新版本的Django。

你也可以安装指定版本的Django:

pip install django==4.2.7

参数说明
- ==4.2.7 :指定安装的Django版本号。

2.2.2 安装版本验证与常见问题处理

验证安装版本

安装完成后,可以通过以下命令查看Django版本:

python -m django --version

输出示例
4.2.7

常见问题处理
  1. 安装后无法识别命令
    如果出现 python: No module named django 错误,请确认是否在虚拟环境中执行命令,并检查 pip list 中是否包含 Django

  2. 版本冲突
    如果系统中存在多个Python版本,建议使用 python3 pip3 命令确保使用的是正确的版本:

bash pip3 install django python3 -m django --version

  1. 网络连接问题
    如果安装过程中出现网络超时,可以尝试更换国内镜像源:

bash pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple

Django安装操作小结
操作 命令 说明
安装Django pip install django 安装最新版本
安装指定版本 pip install django==4.2.7 安装特定版本
查看版本 python -m django --version 查看当前安装的Django版本
使用镜像源安装 pip install django -i <镜像地址> 加快下载速度

2.3 开发工具链的配置

一个高效的开发工具链可以显著提升开发效率。选择合适的编辑器、配置项目结构是本节的重点。

2.3.1 编辑器选择(如VS Code、PyCharm)

Visual Studio Code(VS Code)

VS Code 是轻量级但功能强大的开源编辑器,支持丰富的Python插件,适合Django开发。

安装步骤

  1. 下载并安装 VS Code
  2. 安装Python插件(Microsoft官方插件)。
  3. 打开终端并激活虚拟环境,然后通过以下命令运行Django项目:
python manage.py runserver

优点
- 插件丰富,支持Git、调试、代码片段等。
- 支持远程开发(Remote - SSH)。
- 免费、跨平台。

PyCharm(Community版)

PyCharm 是 JetBrains 推出的专业Python IDE,社区版免费,支持Django项目模板。

安装步骤

  1. 下载并安装 PyCharm Community Edition
  2. 创建新项目时选择Django模板。
  3. 自动创建 manage.py settings.py 等文件。

优点
- 内置Django支持,智能提示更准确。
- 可视化配置数据库、运行服务器等。
- 强大的调试和测试功能。

2.3.2 基本项目目录结构的初始化

Django项目通常通过 django-admin 命令创建,初始目录结构如下:

django-admin startproject myproject

生成的目录结构为:

myproject/
├── manage.py
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
各文件说明
文件名 说明
manage.py Django项目的命令行工具,用于运行服务器、迁移数据库等操作。
__init__.py 标识该目录为Python包。
settings.py 项目配置文件,包括数据库设置、应用注册等。
urls.py URL路由配置文件,定义请求路径与视图函数的映射关系。
wsgi.py Web服务器网关接口配置文件,用于部署。
初始化项目的完整流程图(Mermaid)
graph TD
    A[选择开发编辑器] --> B[安装Python环境]
    B --> C[创建虚拟环境]
    C --> D[安装Django]
    D --> E[创建Django项目]
    E --> F[项目结构初始化]
    F --> G[配置开发环境]
示例代码:运行Django开发服务器

进入项目目录并运行开发服务器:

cd myproject
python manage.py runserver

输出示例
```
Performing system checks…

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run ‘python manage.py migrate’ to apply them.
September 25, 2024 - 15:50:53
Django version 4.2.7, using settings ‘myproject.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

参数说明
- runserver :启动Django内置的开发服务器,默认监听 127.0.0.1:8000
- 可通过指定IP和端口更改监听地址,例如:
bash python manage.py runserver 0.0.0.0:8000

本章详细介绍了Python与Django环境的搭建过程,从Python安装、虚拟环境配置,到Django的安装验证,再到开发工具的选择与项目结构初始化,形成了一个完整的开发环境配置流程。下一章将介绍如何创建Django项目及其目录结构的组成。

3. Django项目初始化与目录结构

Django项目初始化是构建Web应用的第一步。通过项目初始化,开发者可以快速创建出一个标准的项目结构,为后续的开发工作奠定基础。本章将深入探讨Django项目初始化的具体步骤、项目目录结构的组织方式,以及如何运行和测试项目。内容将从命令行操作入手,逐步解析各个核心文件的作用,并结合实际示例展示如何验证项目的运行状态。无论你是初学者还是有一定经验的开发者,都能从中获得清晰的指导。

3.1 创建Django项目的步骤

在完成Django环境搭建后,下一步就是创建一个Django项目。Django提供了一个名为 django-admin 的命令行工具,用于生成项目的基本结构。该结构包含一系列预设的配置文件和目录,便于开发者快速进入开发状态。

3.1.1 使用django-admin命令初始化项目

创建Django项目的过程非常简单,只需要在命令行中执行一条命令即可。以下是创建项目的标准命令:

django-admin startproject myproject

上述命令中:

  • django-admin 是Django的管理工具;
  • startproject 是创建项目的子命令;
  • myproject 是你指定的项目名称。

执行该命令后,Django会在当前目录下生成一个名为 myproject 的目录,该目录中包含项目的基础结构。目录结构如下:

myproject/
├── manage.py
└── myproject/
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py
项目结构说明:
文件/目录名 作用说明
manage.py 项目的管理脚本,用于执行Django命令,如启动服务器、运行迁移等
__init__.py 告诉Python该目录是一个包(package)
settings.py 项目的配置文件,包括数据库配置、应用注册、模板路径等
urls.py URL路由配置文件,定义了项目的URL映射规则
wsgi.py WSGI配置文件,用于部署项目到生产环境
操作流程图:
graph TD
    A[用户执行命令] --> B{django-admin startproject myproject}
    B --> C[生成项目目录]
    C --> D[创建 manage.py]
    C --> E[创建 myproject/ 子目录]
    E --> F[生成 __init__.py]
    E --> G[生成 settings.py]
    E --> H[生成 urls.py]
    E --> I[生成 wsgi.py]

3.1.2 项目主配置文件(settings.py、urls.py等)解析

Django项目的主配置文件位于 myproject/myproject/ 目录下,主要包括 settings.py urls.py 等核心文件。这些文件在项目运行中起着至关重要的作用。

settings.py:项目的全局配置中心

settings.py 是Django项目的全局配置文件,包含如下主要配置项:

  • 基本配置 :如 DEBUG 模式、 ALLOWED_HOSTS 等;
  • 数据库配置 :通过 DATABASES 字典配置数据库连接信息;
  • 应用注册 :通过 INSTALLED_APPS 列表注册项目中使用的所有应用;
  • 静态文件配置 :设置静态文件路径 STATIC_URL STATIC_ROOT 等;
  • 中间件配置 :通过 MIDDLEWARE 列表配置请求处理流程中的中间件;
  • 模板配置 :定义模板路径 TEMPLATES ,包括模板引擎、上下文处理器等。

以下是一个简化版的 settings.py 配置示例:

# settings.py
import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'your-secret-key-here'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

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',
]

ROOT_URLCONF = 'myproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'myproject.wsgi.application'

# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = '/static/'
代码逻辑分析:
  • BASE_DIR :定义了项目根目录的路径,用于后续文件路径的拼接;
  • SECRET_KEY :项目的密钥,用于加密和安全性操作;
  • DEBUG ALLOWED_HOSTS :控制调试模式和允许访问的主机名;
  • INSTALLED_APPS :列出了项目中启用的应用,包括默认的Django管理应用;
  • MIDDLEWARE :中间件列表,处理请求和响应的生命周期;
  • TEMPLATES :模板配置,定义模板路径和上下文处理器;
  • DATABASES :数据库配置,当前使用SQLite作为默认数据库;
  • STATIC_URL :静态文件访问路径。
urls.py:项目的URL路由配置

urls.py 文件是Django项目的路由配置入口,它决定了用户访问的URL如何被映射到具体的视图函数或类。以下是默认生成的 urls.py 内容:

# urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

这段代码表示,当用户访问 /admin/ 路径时,将被路由到Django的后台管理界面。

代码逻辑分析:
  • from django.contrib import admin :导入Django内置的admin模块;
  • path('admin/', admin.site.urls) :定义一个路径匹配规则,当访问 /admin/ 时,调用admin的URL配置。

3.2 Django项目目录结构详解

Django项目目录结构清晰、规范,有助于开发者快速定位文件和理解项目结构。了解目录结构不仅有助于项目维护,也能在团队协作中提高效率。

3.2.1 manage.py的作用与使用方式

manage.py 是Django项目的核心管理脚本,位于项目根目录下。它提供了许多便捷的命令,帮助开发者完成日常的开发、测试和部署任务。

常用命令示例:
命令 作用说明
python manage.py runserver 启动Django开发服务器
python manage.py migrate 应用数据库迁移
python manage.py makemigrations 生成迁移文件
python manage.py createsuperuser 创建管理员用户
python manage.py shell 进入Django交互式Shell
python manage.py collectstatic 收集所有静态文件至指定目录

例如,启动开发服务器的命令如下:

python manage.py runserver

执行该命令后,Django将在本地启动一个轻量级的Web服务器,默认监听 127.0.0.1:8000 。开发者可以通过浏览器访问该地址来查看项目是否正常运行。

manage.py 内部逻辑解析:

manage.py 本质上是一个简单的Python脚本,其核心代码如下:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)
  • os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings") :设置项目的配置模块;
  • execute_from_command_line(sys.argv) :根据命令行参数执行对应的Django管理命令。

3.2.2 核心配置文件的组织方式

Django项目中的核心配置文件包括 settings.py urls.py wsgi.py 等。它们的组织方式遵循一定的逻辑结构,确保项目结构清晰、易于维护。

核心配置文件组织结构表:
文件名 所在路径 主要职责
settings.py myproject/myproject/settings.py 项目全局配置
urls.py myproject/myproject/urls.py 项目URL路由配置
wsgi.py myproject/myproject/wsgi.py WSGI接口配置,用于部署
asgi.py (可选) myproject/myproject/asgi.py ASGI接口配置,用于异步部署

这些文件通常位于项目主目录下(即与 manage.py 同级的目录),并且通过 manage.py 进行引用和调用。

举例说明:如何修改 settings.py 来添加自定义应用

假设我们创建了一个名为 blog 的应用,要将其添加到项目中,需要编辑 settings.py 中的 INSTALLED_APPS 列表:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',  # 添加自定义应用
]

这样,Django就知道该项目中使用了 blog 应用,并会在启动时加载相关模块。

3.3 项目运行与初步测试

在完成项目初始化和配置后,下一步是运行项目并进行初步测试,以确保项目结构完整、配置正确。

3.3.1 启动Django开发服务器

Django自带一个轻量级的开发服务器,非常适合在开发阶段使用。启动服务器的命令如下:

python manage.py runserver

默认情况下,服务器会监听 127.0.0.1:8000 ,你可以在浏览器中访问 http://127.0.0.1:8000/ 来查看默认的欢迎页面。

自定义监听地址和端口:

如果你想让服务器监听其他地址或端口,可以加上参数:

python manage.py runserver 0.0.0.0:8080

上述命令将使服务器监听所有网络接口的8080端口,适用于局域网调试。

3.3.2 浏览器访问与页面显示验证

启动服务器后,打开浏览器访问 http://127.0.0.1:8000/ ,你会看到Django的欢迎页面,页面上会显示“Welcome to Django”和一些提示信息,表明项目运行正常。

如果你访问了 /admin/ 路径(如 http://127.0.0.1:8000/admin/ ),Django会提示你登录。此时你可以通过以下命令创建超级用户:

python manage.py createsuperuser

系统会提示你输入用户名、邮箱和密码。创建完成后,再次访问 /admin/ 页面并使用该账户登录,即可进入Django的后台管理界面。

示例截图说明(伪描述):
[浏览器截图描述]
URL: http://127.0.0.1:8000/
页面内容:
Welcome to Django
It worked!
The install worked successfully! Congratulations!

这表明你的Django项目已经成功初始化并运行。

通过本章的学习,你已经掌握了Django项目初始化的完整流程,包括项目创建、核心配置文件的结构与作用,以及项目的运行和初步测试方法。这些知识将为后续章节中应用的创建与注册、模型设计等打下坚实的基础。

4. 应用创建与注册流程

Django 的核心设计理念之一是“可插拔性”(pluggable),这体现在其“应用(App)”的结构上。一个 Django 项目由多个应用组成,每个应用负责特定的功能模块,彼此之间保持高内聚、低耦合。通过合理组织应用,可以提高代码的可维护性和可复用性。本章将深入讲解 Django 应用的基本概念、创建方法、注册流程及其模块组织方式。

4.1 应用的基本概念与创建方法

4.1.1 什么是 Django 应用(App)

在 Django 中,应用(App)是功能独立、职责明确的模块单位。它通常包含模型(models)、视图(views)、模板(templates)、表单(forms)、管理界面(admin)等组件。一个项目可以包含多个应用,这些应用通过统一的 URL 路由进行组织和访问。

Django 应用的核心特点是:

  • 功能独立 :每个应用专注于解决一个业务问题。
  • 可复用性 :应用可以在多个项目中重复使用。
  • 易于管理 :模块化结构便于团队协作和版本控制。

4.1.2 使用命令创建应用(startapp)

Django 提供了 startapp 命令用于快速创建一个新的应用。执行以下命令即可创建名为 blog 的应用:

python manage.py startapp blog

该命令会在项目目录下生成一个名为 blog 的文件夹,其默认结构如下:

blog/
├── __init__.py
├── admin.py
├── apps.py
├── migrations/
│   └── __init__.py
├── models.py
├── tests.py
└── views.py
各文件作用说明:
文件名 作用描述
__init__.py 标识该目录为 Python 包
admin.py 注册模型以在 Django 管理后台显示
apps.py 应用配置类,用于定义应用的基本信息
migrations/ 存放数据库迁移脚本
models.py 定义数据模型(数据库结构)
tests.py 编写单元测试代码
views.py 定义视图函数或类,处理请求和响应

4.2 应用的注册与配置

4.2.1 在 settings.py 中注册应用

创建完应用后,必须将其注册到项目的 settings.py 文件中,否则 Django 无法识别该应用的存在。在 INSTALLED_APPS 列表中添加应用名即可完成注册:

# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册应用
    'blog.apps.BlogConfig',  # 推荐方式:使用配置类
]

也可以简写为:

'blog',  # 自动查找 apps.py 中的配置类
逻辑说明:
  • 'blog.apps.BlogConfig' 是显式指定应用的配置类。
  • 'blog' 是 Django 自动查找的方式,它会默认在 apps.py 中查找与应用名匹配的配置类。

4.2.2 应用配置文件(apps.py)的使用

Django 为每个应用提供了一个 apps.py 文件,用于定义应用的配置类。默认内容如下:

# blog/apps.py

from django.apps import AppConfig

class BlogConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'blog'
参数说明:
  • default_auto_field :指定模型中自动生成的主键字段类型,默认为 BigAutoField
  • name :应用的 Python 路径,必须与应用目录名称一致。
扩展用法:

可以在配置类中重写 ready() 方法,用于执行应用加载时的初始化逻辑,例如连接外部服务、加载缓存等:

def ready(self):
    # 应用启动时执行的代码
    import blog.signals  # 加载信号处理模块

4.3 应用模块的组织与职责划分

4.3.1 应用中 models.py、views.py 等文件的作用

Django 应用的各个模块文件有明确的职责划分,保持良好的结构有助于项目的长期维护。

models.py:数据模型定义

该文件用于定义与数据库表映射的模型类,例如:

# blog/models.py

from django.db import models
from django.contrib.auth.models import User

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title
参数说明:
  • CharField :字符字段,用于标题等短文本。
  • TextField :长文本字段,用于文章内容。
  • ForeignKey :外键字段,用于关联用户。
  • DateTimeField :时间字段, auto_now_add=True 表示自动设置为创建时间。
views.py:视图处理请求

视图用于处理 HTTP 请求并返回响应。例如:

# blog/views.py

from django.shortcuts import render
from .models import Post

def post_list(request):
    posts = Post.objects.all()
    return render(request, 'blog/post_list.html', {'posts': posts})
逻辑说明:
  • Post.objects.all() :从数据库中获取所有文章。
  • render() :将数据渲染到指定模板中返回。
admin.py:注册模型到管理后台
# blog/admin.py

from django.contrib import admin
from .models import Post

admin.site.register(Post)

注册后,可在 Django 管理后台中对文章进行增删改查操作。

urls.py:路由配置(需手动创建)

默认情况下,Django 不为应用创建 urls.py ,需手动创建并在项目 urls.py 中包含:

# blog/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.post_list, name='post_list'),
]

然后在项目 urls.py 中引入:

# project/urls.py

from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
]

4.3.2 多应用项目结构的设计思路

在大型项目中,通常包含多个应用,如用户管理(users)、文章系统(blog)、评论系统(comments)等。合理的结构设计如下:

myproject/
├── myproject/
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── blog/
├── users/
├── comments/
├── manage.py
设计原则:
  1. 职责分离 :每个应用只负责一个核心功能。
  2. 低耦合 :应用之间通过接口通信,避免直接依赖。
  3. 高内聚 :功能相关的内容放在同一应用中。
  4. 便于扩展 :新增功能只需添加新应用,不影响现有结构。
举例说明:
  • blog 应用负责文章发布。
  • users 应用处理用户注册、登录等。
  • comments 应用实现评论功能,依赖 blog users

通过这种设计,项目结构清晰、易于维护,也便于团队协作。

总结

本章深入讲解了 Django 应用的创建、注册流程及其模块组织方式。我们通过 startapp 创建应用,将其注册到 settings.py ,并详细解析了 apps.py 的作用。同时,我们探讨了应用中各模块文件的功能,并通过示例代码展示了其使用方式。最后,我们提出了多应用项目的设计思路,强调了模块化、低耦合、高内聚的开发原则。

下一章我们将深入探讨 Django 模型(Model)的设计与实现,理解如何通过 Python 类定义数据库结构,并进行数据的增删改查操作。

5. Django模型(Model)设计与实现

在Web开发中,模型(Model)是Django架构中最核心的组成部分之一,它负责与数据库进行交互。模型的设计不仅决定了数据的存储结构,也影响着整个项目的扩展性与可维护性。本章将从模型的基本概念出发,逐步深入讲解模型类的定义、字段类型、关系设计,以及如何通过模型实现数据库的增删改查操作。我们将结合具体代码示例,展示如何在实际项目中高效地使用Django模型。

5.1 数据模型的基本概念

在Django中,模型是与数据库表一一对应的Python类。每个模型类对应一张数据库表,类的每个属性代表表中的一个字段。这种映射机制使得开发者无需直接编写SQL语句,即可完成数据库操作。

5.1.1 模型类与数据库表的映射关系

Django通过ORM(对象关系映射)机制将模型类映射为数据库表。例如,以下是一个简单的模型类定义:

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

该模型类 Book 将被Django映射为名为 book 的数据库表(默认情况下,表名是模型类名的小写形式),包含三个字段: title author published_date

映射机制说明:

  • 类名 Book → 表名 book
  • 属性名 title , author , published_date → 字段名
  • 字段类型如 CharField , DateField → 对应数据库字段类型如 VARCHAR , DATE

5.1.2 字段类型与参数设置

Django提供了丰富的字段类型,适用于各种数据结构的存储需求。常见的字段类型包括:

字段类型 描述 示例用法
CharField 存储短文本,需指定最大长度 models.CharField(max_length=100)
TextField 存储长文本 models.TextField()
IntegerField 存储整数 models.IntegerField()
DateField 存储日期 models.DateField()
DateTimeField 存储日期和时间 models.DateTimeField()
BooleanField 存储布尔值 models.BooleanField()
ForeignKey 外键,表示一对多关系 models.ForeignKey(User)
ManyToManyField 多对多关系 models.ManyToManyField(Tag)

参数设置示例:

title = models.CharField(max_length=100, blank=True, null=True)
  • max_length :最大长度限制
  • blank=True :允许字段为空(用于表单验证)
  • null=True :允许数据库中该字段为 NULL

5.2 模型类的定义与使用

在理解了模型的基本概念后,我们可以开始定义自己的模型类,并在实际开发中使用它们。

5.2.1 常用字段类型(CharField、IntegerField等)

下面我们将通过一个实际的模型类示例来展示常用字段的使用方式:

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=200)          # 商品名称
    description = models.TextField()                 # 商品描述
    price = models.DecimalField(max_digits=10, decimal_places=2)  # 价格
    stock = models.IntegerField()                    # 库存数量
    is_available = models.BooleanField(default=True) # 是否有货
    created_at = models.DateTimeField(auto_now_add=True) # 创建时间
    updated_at = models.DateTimeField(auto_now=True)     # 更新时间

字段说明:

  • CharField :适用于标题、名称等短文本字段。
  • TextField :适合大段文本内容,如商品描述。
  • DecimalField :精确数值类型,适合金额、价格等场景, max_digits 表示总位数, decimal_places 表示小数位数。
  • IntegerField :存储整数,如库存、数量等。
  • BooleanField :布尔值字段,常用于开关、状态判断。
  • DateTimeField :记录时间戳, auto_now_add 在创建时自动填充, auto_now 在每次保存时更新。

5.2.2 模型类的继承与关系定义(外键、多对多等)

Django模型支持继承机制,可以基于已有模型构建新的模型。此外,模型之间可以通过外键(ForeignKey)和多对多(ManyToManyField)建立关系。

模型继承示例:
class Animal(models.Model):
    name = models.CharField(max_length=100)

    class Meta:
        abstract = True

class Dog(Animal):
    breed = models.CharField(max_length=100)
  • abstract = True 表示这是一个抽象基类,不会在数据库中生成表。
  • Dog 继承自 Animal ,将拥有 name 字段,并添加 breed 字段。
外键(ForeignKey)关系:
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
  • on_delete=models.CASCADE 表示当关联的 Author 被删除时,其关联的 Book 也将被删除。
  • Django会自动在数据库中创建外键约束。
多对多(ManyToManyField)关系:
class Tag(models.Model):
    name = models.CharField(max_length=50)

class Article(models.Model):
    title = models.CharField(max_length=200)
    tags = models.ManyToManyField(Tag)
  • 一个 Article 可以有多个 Tag ,反之亦然。
  • Django会自动生成中间表来管理多对多关系。
关系模型流程图(mermaid):
erDiagram
    AUTHOR ||--o{ BOOK : "1:N"
    BOOK }|--|| TAG : "N:M"
    AUTHOR {
        id INT
        name VARCHAR
    }
    BOOK {
        id INT
        title VARCHAR
        author_id INT
    }
    TAG {
        id INT
        name VARCHAR
    }

5.3 数据库交互与操作

模型定义完成后,我们就可以通过Django ORM进行数据库的增删改查操作。这些操作无需编写SQL语句,完全通过Python对象进行。

5.3.1 模型对象的创建与保存

创建模型对象并保存到数据库的步骤如下:

# 创建对象
product = Product(
    name="智能手机",
    description="高性能智能手机",
    price=2999.99,
    stock=50
)

# 保存到数据库
product.save()

执行逻辑说明:

  1. 实例化 Product 类,传入字段值。
  2. 调用 save() 方法将对象保存到数据库。
  3. 如果是新对象,Django会执行 INSERT 操作;如果对象已存在,则执行 UPDATE

5.3.2 查询操作(filter、get、all等)

Django ORM提供了丰富的查询方法,以下是几个常用的查询操作:

查询所有对象:
products = Product.objects.all()
for p in products:
    print(p.name)
条件查询:
# 查询价格大于 1000 的商品
expensive_products = Product.objects.filter(price__gt=1000)
查询单个对象:
# 查询ID为1的商品
product = Product.objects.get(id=1)

注意: get() 方法在找不到对象时会抛出 DoesNotExist 异常,若不确定是否存在,建议使用 filter().first()

排序查询:
# 按价格升序排列
sorted_products = Product.objects.order_by('price')

5.3.3 数据更新与删除

更新数据:
# 获取对象并修改字段
product = Product.objects.get(id=1)
product.price = 3299.99
product.save()

或者使用 update() 方法批量更新:

Product.objects.filter(price__lt=1000).update(is_available=False)
删除数据:
# 删除单个对象
product = Product.objects.get(id=1)
product.delete()

# 删除所有库存为0的商品
Product.objects.filter(stock=0).delete()

删除注意事项:

  • 删除操作是不可逆的,务必谨慎。
  • 若有关联外键且设置了 on_delete=models.PROTECT ,则删除主对象时会抛出异常。

5.3.4 查询性能优化建议

在实际项目中,频繁的数据库查询会影响性能。以下是一些优化技巧:

1. 使用 select_related() (适用于外键)
books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)  # 不会触发额外查询
2. 使用 prefetch_related() (适用于多对多)
articles = Article.objects.prefetch_related('tags').all()
for article in articles:
    for tag in article.tags.all():
        print(tag.name)  # 不会触发N+1查询
3. 避免在循环中查询数据库

错误示例:

for book in Book.objects.all():
    print(book.author.name)  # 每次循环都触发查询

优化示例:

books = Book.objects.select_related('author').all()
for book in books:
    print(book.author.name)  # 一次查询完成

通过本章的学习,我们了解了Django模型的基本概念、字段类型与参数设置,掌握了模型类的定义方式及其继承机制,并通过代码示例演示了模型与数据库的交互操作。在下一章中,我们将深入探讨Django的数据库迁移机制,学习如何通过 makemigrations migrate 命令管理数据库结构的变更。

6. 数据库迁移(makemigrations 和 migrate)操作

Django 的数据库迁移机制是其核心功能之一,它使得开发者能够在开发过程中对数据库结构进行修改并同步到数据库中,而无需手动执行 SQL 语句。通过 makemigrations migrate 命令,Django 可以自动生成迁移脚本并应用这些变更,确保模型与数据库结构保持同步。本章将深入探讨迁移的基本原理、操作流程以及常见问题的排查与处理。

6.1 数据库迁移的基本原理

数据库迁移是 Django 提供的一种机制,用于将模型(models)的变更同步到数据库中。迁移文件本质上是一组 Python 脚本,记录了模型的变化历史,使得数据库结构可以逐步演化,而不丢失数据。

6.1.1 迁移文件的作用与生成机制

每当开发者对模型文件(models.py)做出更改后,Django 会通过 makemigrations 命令生成迁移文件。这些文件位于应用的 migrations 目录下,命名格式为 0001_initial.py 0002_auto_20250405_1200.py 等。

迁移文件的主要作用包括:

  • 记录模型变更 :包括新增字段、修改字段类型、删除字段、添加索引等。
  • 数据库结构变更 :通过生成 SQL 语句或使用数据库 API 实现表结构变更。
  • 版本控制数据库结构 :便于团队协作和部署时的数据库一致性维护。
示例:生成迁移文件

假设我们在 models.py 中定义了一个简单的模型:

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

执行命令生成迁移文件:

python manage.py makemigrations

输出如下:

Migrations for 'books':
  books/migrations/0001_initial.py
    - Create model Book
迁移文件解析

生成的迁移文件内容如下:

# 0001_initial.py
from django.db import migrations, models

class Migration(migrations.Migration):

    initial = True

    dependencies = []

    operations = [
        migrations.CreateModel(
            name='Book',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=100)),
                ('author', models.CharField(max_length=100)),
                ('published_date', models.DateField()),
            ],
        ),
    ]

这段代码定义了一个迁移类 Migration ,其中 operations 列表描述了数据库操作,这里是创建 Book 表。每个迁移文件都会被记录在数据库的 django_migrations 表中,用于跟踪应用的迁移状态。

6.1.2 makemigrations 与 migrate 命令的区别

特性 makemigrations migrate
功能 生成迁移文件 应用迁移到数据库
是否修改数据库
是否生成文件
执行时机 模型变更后 部署或开发阶段同步数据库结构
文件位置 app/migrations/ 不生成文件
是否可重复执行 是(无变更则不生成) 是(但已有迁移不会重复执行)

6.2 执行迁移操作

迁移操作通常包括两个步骤:生成迁移文件和应用迁移到数据库。

6.2.1 生成迁移文件(makemigrations)

生成迁移文件的过程由 makemigrations 命令完成。开发者在模型中添加、修改或删除字段后,Django 会检测这些变化并生成对应的迁移脚本。

示例:添加字段并生成迁移

Book 模型中添加一个 pages 字段:

# models.py
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()
    pages = models.IntegerField()  # 新增字段

执行命令:

python manage.py makemigrations

输出如下:

You are trying to add a non-nullable field 'pages' to book without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py

Django 提示我们需要为新增的非空字段提供默认值。选择 1 并输入默认值,如 100

此时会生成新的迁移文件 0002_book_pages.py

6.2.2 应用迁移到数据库(migrate)

生成迁移文件后,需要使用 migrate 命令将这些变更应用到数据库中。

示例:执行迁移
python manage.py migrate

输出如下:

Operations to perform:
  Apply all migrations: books
Running migrations:
  Applying books.0001_initial... OK
  Applying books.0002_book_pages... OK

此时数据库结构已更新, Book 表中新增了 pages 字段。

6.3 迁移问题的排查与处理

迁移过程中可能会遇到各种问题,如迁移冲突、依赖问题、数据库不一致等。以下是常见问题及解决方案。

6.3.1 迁移冲突与依赖问题

当多个开发者同时修改模型并生成迁移文件时,可能会出现迁移冲突。Django 会提示:

Conflict detected between database and migration files.
解决方案:
  1. 查看迁移状态

bash python manage.py showmigrations

该命令会列出所有迁移及其应用状态。

  1. 手动合并迁移文件

如果存在两个未应用的迁移文件(如 0002_auto_20250405_1000.py 0002_auto_20250405_1001.py ),可以手动合并它们为一个迁移文件,并更新依赖关系。

  1. 指定依赖关系

在迁移文件中手动添加依赖:

python dependencies = [ ('books', '0001_initial'), ]

Mermaid 流程图:迁移冲突处理流程
graph TD
    A[检测到迁移冲突] --> B{是否有未应用迁移?}
    B -->|是| C[查看 showmigrations]
    B -->|否| D[检查数据库与迁移文件一致性]
    C --> E[合并迁移文件]
    E --> F[更新依赖关系]
    F --> G[重新执行 migrate]

6.3.2 回滚迁移与重新生成

有时需要回滚某个迁移以修正模型或迁移逻辑。

步骤:
  1. 查看已应用的迁移

bash python manage.py showmigrations books

输出:

[X] 0001_initial [X] 0002_book_pages

  1. 回滚到指定迁移

bash python manage.py migrate books 0001_initial

这将撤销 0002_book_pages 迁移。

  1. 删除迁移文件并重新生成

删除 0002_book_pages.py ,然后重新执行:

bash python manage.py makemigrations python manage.py migrate

注意事项:
  • 数据丢失风险 :回滚迁移可能导致数据库结构变化,从而影响已有数据。
  • 生产环境谨慎操作 :建议在测试环境中验证回滚流程后再在生产环境中执行。

总结

本章深入解析了 Django 的迁移机制,包括迁移文件的生成原理、 makemigrations migrate 命令的使用方法,以及迁移冲突与回滚的处理方式。通过本章的学习,开发者可以更熟练地管理数据库结构变更,确保模型与数据库的一致性,提升开发效率与系统稳定性。

7. 视图(View)函数编写与请求处理

7.1 视图函数的基本结构

在Django中,视图(View)是处理请求的核心组件。它接收来自客户端的请求,并返回响应。Django视图函数通常接收一个 HttpRequest 对象作为参数,并返回一个 HttpResponse 对象。

7.1.1 请求对象(HttpRequest)与响应对象(HttpResponse)

HttpRequest 对象包含了请求的所有信息,如请求方法、路径、头信息、GET/POST数据等。 HttpResponse 则是Django返回给客户端的数据,可以是HTML页面、JSON数据、重定向等。

from django.http import HttpResponse

def hello_view(request):
    return HttpResponse("Hello, Django!")

上述代码定义了一个简单的视图函数 hello_view ,它接收一个请求对象 request ,并返回一个包含字符串 "Hello, Django!" 的响应。

7.1.2 简单视图函数的编写与测试

我们可以创建一个新的应用 pages ,并在其中创建视图函数:

python manage.py startapp pages

pages/views.py 中添加:

from django.http import HttpResponse

def home_page_view(request):
    return HttpResponse("<h1>Welcome to the Home Page</h1>")

接着,我们需要在 urls.py 中将URL路径与视图函数绑定:

from django.urls import path
from pages import views

urlpatterns = [
    path('', views.home_page_view, name='home'),
]

运行开发服务器:

python manage.py runserver

访问 http://127.0.0.1:8000/ ,你应该能看到“Welcome to the Home Page”的标题。

7.2 视图函数的高级用法

Django视图不仅可以返回简单的文本响应,还能根据请求方法进行判断,并动态渲染模板。

7.2.1 请求方法判断(GET/POST)

我们可以根据请求方法执行不同的逻辑。例如,下面的视图函数处理GET和POST请求:

from django.http import HttpResponse

def form_view(request):
    if request.method == 'GET':
        return HttpResponse("<form method='post'>"
                            "<input type='text' name='username'>"
                            "<input type='submit' value='Submit'>"
                            "</form>")
    elif request.method == 'POST':
        username = request.POST.get('username', '')
        return HttpResponse(f"Hello, {username}!")

urls.py 中添加路径:

path('form/', views.form_view, name='form'),

访问 /form/ ,输入用户名后提交,页面将显示“Hello, 用户名”。

7.2.2 模板渲染与数据传递(render函数)

为了返回更复杂的HTML内容,我们通常使用模板系统。Django的 render 函数可以将模板与上下文数据结合,生成响应。

首先,创建模板目录:

pages/
└── templates/
    └── pages/
        └── greeting.html

greeting.html 中编写:

<h1>Hello, {{ name }}!</h1>

修改视图函数:

from django.shortcuts import render

def greeting_view(request):
    context = {'name': 'World'}
    return render(request, 'pages/greeting.html', context)

绑定URL:

path('greeting/', views.greeting_view, name='greeting'),

访问 /greeting/ ,你将看到“Hello, World!”的页面。

7.3 基于类的视图(Class-Based Views)

Django还支持基于类的视图(Class-Based Views),它们提供了更结构化的代码组织方式和内置的功能支持。

7.3.1 类视图的优势与使用场景

类视图通过继承和重写方法来实现功能复用,适合处理常见的视图逻辑,如列表展示、详情页、创建/更新/删除等。例如, TemplateView 用于渲染静态模板, ListView 用于展示对象列表。

7.3.2 常见通用视图(ListView、DetailView等)的使用方式

假设我们有一个模型 Article

# models.py
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

我们可以使用 ListView 展示所有文章:

# views.py
from django.views.generic import ListView
from .models import Article

class ArticleListView(ListView):
    model = Article
    template_name = 'pages/article_list.html'
    context_object_name = 'articles'

创建模板 pages/article_list.html

<h1>Article List</h1>
<ul>
  {% for article in articles %}
    <li>{{ article.title }}</li>
  {% endfor %}
</ul>

绑定URL:

from .views import ArticleListView

urlpatterns = [
    path('articles/', ArticleListView.as_view(), name='article-list'),
]

访问 /articles/ ,你将看到所有文章的标题列表。

同样,我们可以使用 DetailView 来展示单个文章的详细信息:

from django.views.generic import DetailView

class ArticleDetailView(DetailView):
    model = Article
    template_name = 'pages/article_detail.html'
    context_object_name = 'article'

模板 pages/article_detail.html

<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>

URL配置:

path('articles/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),

访问 /articles/1/ (假设存在ID为1的文章),你将看到该文章的详细内容。

本章通过函数视图与类视图两种方式,深入讲解了Django中视图的编写方式与请求处理逻辑。从基础的响应返回,到模板渲染,再到基于类的通用视图,我们逐步构建了完整的视图处理流程,为后续的页面展示和交互功能打下坚实基础。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Django是一个基于Python的高级Web开发框架,以“快速、易用、强大”著称。本文通过官方示例“FirstProgram”,详细讲解了Django项目的创建流程,包括安装配置、应用生成、模型定义、数据库迁移、视图编写、URL路由配置、模板创建和服务器运行等步骤。通过该示例,开发者可以全面掌握Django的基础结构与开发模式,为构建复杂Web应用打下坚实基础。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值