Django 教程入门指南


Django 入门指南:从零开始构建你的第一个 Web 应用

引言

在当今互联网时代,Web 开发已成为一项炙手可热的技能。而在众多 Web 框架中,基于 Python 的 Django 以其“自带电池”(Batteries Included)、高效开发、安全可靠、社区活跃等特性,受到了全球开发者的青睐。无论你是 Python 初学者希望涉足 Web 开发,还是有经验的开发者想要掌握一款强大的后端框架,Django 都是一个绝佳的选择。

本指南旨在为初学者提供一个清晰、详尽的 Django 入门路线图,从环境搭建到构建一个简单的 Web 应用,逐步揭开 Django 的神秘面纱。本文将涵盖 Django 的核心概念、基本操作流程以及学习过程中需要注意的关键点,力求让你在阅读后能够独立上手,开启你的 Django 开发之旅。

一、 为什么选择 Django?

在开始学习之前,了解选择 Django 的理由有助于增强学习动力:

  1. 快速开发 (Rapid Development):Django 遵循 DRY (Don't Repeat Yourself) 原则,提供了大量内置组件(如 ORM、管理后台、表单处理、认证系统等),开发者可以专注于业务逻辑,避免重复造轮子,从而大大提高开发效率。
  2. 功能完备 (Batteries Included):与其他微框架不同,Django 提供了构建复杂 Web 应用所需的大部分功能,无需开发者再去费力寻找和集成各种第三方库(当然,需要时也可以轻松集成)。
  3. 安全性 (Security):Django 内置了多种安全防护机制,能够有效抵御常见的 Web 攻击,如 CSRF(跨站请求伪造)、XSS(跨站脚本攻击)、SQL 注入等。框架的设计者们非常重视安全问题,并会及时发布安全补丁。
  4. 可扩展性 (Scalability):Django 的组件化设计使其具有良好的可扩展性。从小型个人项目到大型商业应用(如 Instagram、Pinterest、NASA 官网等),Django 都能胜任。它能够很好地与缓存系统、负载均衡器等配合工作。
  5. 强大的 ORM (Object-Relational Mapper):Django 的 ORM 允许开发者使用 Python 代码来操作数据库,而无需编写复杂的 SQL 语句。它支持多种主流数据库(PostgreSQL, MySQL, SQLite, Oracle),并且数据库迁移(Migrations)功能使得数据库结构变更管理变得简单可控。
  6. 完善的管理后台 (Admin Interface):只需几行代码,Django 就能自动生成一个功能强大的管理后台,方便网站管理员对数据进行增删改查操作,极大节省了后台管理功能的开发时间。
  7. 活跃的社区与丰富的文档 (Community & Documentation):Django 拥有一个庞大而活跃的全球开发者社区,遇到问题时很容易找到帮助。官方文档详尽且质量高,被誉为业界典范,是学习 Django 的最佳资源。

二、 学习 Django 的先决条件

在正式开始 Django 学习之前,你需要具备以下基础知识和工具:

  1. Python 基础:Django 是一个 Python 框架,因此你需要熟悉 Python 的基本语法、数据类型(列表、字典、元组、集合)、函数、类、模块和包等概念。了解面向对象编程(OOP)会对理解 Django 的设计更有帮助。
  2. 命令行/终端基础:Django 的许多操作(如创建项目、运行服务器、执行数据库迁移等)都需要通过命令行来完成。你需要熟悉基本的命令行操作(如 cd, ls/dir, mkdir, python, pip 等)。
  3. HTML/CSS/JavaScript 基础 (可选但推荐):虽然 Django 主要负责后端逻辑,但 Web 应用最终需要通过 HTML 呈现给用户,用 CSS 美化样式,用 JavaScript 增加交互。了解这些前端基础知识将使你能够更好地构建完整的 Web 应用。
  4. 了解基本的 Web 概念:理解 HTTP 协议(请求/响应模型、GET/POST 方法)、URL、客户端/服务器架构等基本概念。
  5. 文本编辑器或 IDE:你需要一个代码编辑器来编写 Python 和 HTML 代码。流行的选择包括 VS Code、PyCharm、Sublime Text、Atom 等。
  6. Python 和 Pip 环境:确保你的电脑上安装了 Python(推荐较新稳定版本,如 Python 3.8+)以及包管理工具 Pip。可以通过在命令行输入 python --versionpip --version 来检查。

三、 核心概念解析

在深入实践之前,先了解 Django 的几个核心概念:

  1. MVT 架构模式 (Model-View-Template):Django 采用了 MVT 设计模式,这是 MVC (Model-View-Controller) 的一种变体。

    • Model (模型):负责与数据库交互,定义数据结构(对应数据库表),并包含业务逻辑。它通常是 models.py 文件中的 Python 类。
    • View (视图):接收 HTTP 请求,处理业务逻辑(可能需要调用 Model 查询或修改数据),并返回 HTTP 响应。响应内容通常由 Template 渲染生成。它通常是 views.py 文件中的 Python 函数或类。
    • Template (模板):负责定义页面的结构和表现(通常是 HTML 文件)。它包含静态内容和动态占位符,视图会将数据填充到占位符中,最终生成发送给浏览器的 HTML 页面。Django 有自己的模板语言 (DTL - Django Template Language)。
    • URL Dispatcher (URL 分发器):虽然不直接在 MVT 缩写中,但 URL 分发器是连接用户请求和视图的关键。它根据用户访问的 URL,将请求路由到对应的视图函数进行处理。这通常在 urls.py 文件中配置。
  2. 项目 (Project) 与应用 (App)

    • Project:代表一个完整的网站或 Web 应用程序。一个 Django 项目包含了一系列配置(如数据库设置、安装的应用列表、全局 URL 配置等)和若干个 App。
    • App:代表项目中的一个特定功能模块(如博客模块、用户认证模块、论坛模块等)。一个 App 通常包含自己的 Models, Views, Templates 和 URLs。App 的设计理念是为了实现代码的复用性和模块化。一个 App 可以被用于多个不同的 Django 项目中。
  3. ORM (Object-Relational Mapper):如前所述,它允许你用 Python 对象来操作数据库表,将数据库操作抽象化,提高开发效率和代码可读性,并能在一定程度上实现数据库解耦。

  4. 数据库迁移 (Migrations):当你修改了 Model(例如添加字段、修改类型),Django 的迁移系统可以自动生成相应的 SQL 语句来更新数据库结构,并能跟踪迁移历史,方便版本控制和回滚。

四、 Django 入门实战步骤

接下来,我们将一步步创建一个简单的 Django 项目和应用。

步骤 1:环境准备与虚拟环境

在开始任何 Python 项目之前,强烈推荐使用虚拟环境。虚拟环境可以为每个项目创建一个隔离的 Python 运行环境,避免不同项目之间的库依赖冲突。

```bash

1. 创建项目目录 (例如 mydjangosite)

mkdir mydjangosite
cd mydjangosite

2. 创建虚拟环境 (venv 是 Python 3.3+ 内置的模块)

在 Windows 上: python -m venv venv

在 macOS/Linux 上: python3 -m venv venv

python -m venv venv

3. 激活虚拟环境

在 Windows 上 (cmd.exe): venv\Scripts\activate

在 Windows 上 (PowerShell): venv\Scripts\Activate.ps1 (可能需要先设置执行策略: Set-ExecutionPolicy Unrestricted -Scope Process)

在 macOS/Linux 上: source venv/bin/activate

激活成功后,命令行提示符前会出现 (venv) 字样

(venv) C:\Users\YourUser\mydjangosite>

```

步骤 2:安装 Django

在激活的虚拟环境中,使用 pip 安装 Django:

```bash

(venv)

pip install django
```

安装完成后,可以通过 pip freeze 查看已安装的包,或者 django-admin --version 检查 Django 版本。

步骤 3:创建 Django 项目 (Project)

使用 django-admin 命令创建一个新的 Django 项目:

```bash

(venv)

注意命令最后的 '.' 表示在当前目录 (mydjangosite) 下创建项目文件

如果不加 '.', 会创建一个名为 mysite 的子目录

django-admin startproject mysite .
```

执行后,当前目录下会生成以下文件和目录结构:

mydjangosite/
├── manage.py # 项目管理命令行工具入口
├── mysite/ # 项目的 Python 包 (与项目同名)
│ ├── __init__.py # 表明这是一个 Python 包
│ ├── asgi.py # ASGI 服务器入口 (用于异步)
│ ├── settings.py # 项目配置文件!非常重要
│ ├── urls.py # 项目的全局 URL 配置
│ └── wsgi.py # WSGI 服务器入口 (用于同步)
└── venv/ # 虚拟环境目录 (根据你的创建方式)

  • manage.py: 一个非常重要的命令行工具,用于执行各种 Django 管理任务,如运行开发服务器、创建应用、数据库迁移等。
  • mysite/settings.py: 包含项目的所有配置,如数据库连接、安装的应用列表、中间件、模板路径、静态文件路径、安全密钥等。
  • mysite/urls.py: 定义整个项目的 URL 路由规则。

步骤 4:运行开发服务器

Django 自带一个轻量级的 Web 服务器,主要用于开发和测试。

```bash

(venv)

python manage.py runserver
```

如果一切正常,你会看到类似以下的输出:

```
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
February 29, 2024 - 15:30:00
Django version 4.2.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK (Windows) or CTRL-C (macOS/Linux).
```

现在,打开浏览器访问 http://127.0.0.1:8000/http://localhost:8000/,你应该能看到 Django 的欢迎页面("The install worked successfully! Congratulations!")。这表明你的 Django 项目已成功创建并运行。

Ctrl+C 可以停止开发服务器。

步骤 5:创建 Django 应用 (App)

一个项目通常由多个应用组成。我们来创建一个名为 polls(投票)的应用。

```bash

(venv)

确保你在 manage.py 所在的目录下执行

python manage.py startapp polls
```

这会在 mydjangosite 目录下创建一个新的 polls 目录,结构如下:

polls/
├── __init__.py
├── admin.py # 配置应用在 Django Admin 界面的显示
├── apps.py # 应用本身的配置
├── migrations/ # 存放数据库迁移文件
│ └── __init__.py
├── models.py # 定义数据模型 (数据库表结构)
├── tests.py # 编写应用测试用例
└── views.py # 编写视图函数/类 (处理请求和响应)

重要:注册应用

创建应用后,需要告诉 Django 项目这个应用的存在。打开 mysite/settings.py 文件,找到 INSTALLED_APPS 列表,将你的应用添加进去(通常添加应用的配置类,位于 apps.py 中):

```python

mysite/settings.py

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'polls.apps.PollsConfig', # 添加这一行,或者直接写 'polls' 也可以,推荐前者
]
```

步骤 6:定义模型 (Models)

polls/models.py 文件中定义数据模型。假设我们要做一个简单的投票应用,需要 Question(问题)和 Choice(选项)两个模型。

```python

polls/models.py

from django.db import models
import datetime
from django.utils import timezone

class Question(models.Model):
question_text = models.CharField(max_length=200) # 问题文本,字符类型,最大长度200
pub_date = models.DateTimeField('date published') # 发布日期,日期时间类型

def __str__(self):
    return self.question_text

def was_published_recently(self):
    now = timezone.now()
    return now - datetime.timedelta(days=1) <= self.pub_date <= now

class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE) # 外键关联到 Question,级联删除
choice_text = models.CharField(max_length=200) # 选项文本
votes = models.IntegerField(default=0) # 票数,整型,默认值为 0

def __str__(self):
    return self.choice_text

```

  • 每个模型都是 django.db.models.Model 的子类。
  • 每个字段(如 question_text, pub_date)都是 models.Field 类的实例,定义了字段类型和约束。
  • ForeignKey 定义了多对一关系(一个问题有多个选项)。on_delete=models.CASCADE 表示当关联的 Question 被删除时,相关的 Choice 也一并删除。
  • __str__ 方法定义了模型对象的字符串表示形式,方便在 Admin 或 Shell 中查看。

步骤 7:数据库迁移 (Migrations)

定义好模型后,需要让 Django 根据模型创建或更新数据库表结构。

```bash

(venv)

1. 生成迁移文件 (检查模型变化,并在 polls/migrations/ 目录下生成迁移脚本)

python manage.py makemigrations polls

你会看到类似输出:

Migrations for 'polls':

polls\migrations\0001_initial.py

- Create model Question

- Create model Choice

2. 应用迁移 (执行迁移脚本,真正在数据库中创建表)

python manage.py migrate

这会应用所有未应用的迁移,包括 Django 内置应用(如 admin, auth)的迁移和我们刚刚为 polls 生成的迁移

```

Django 默认使用 SQLite 数据库(在 settings.pyDATABASES 配置中可以看到),它会在项目根目录下创建一个 db.sqlite3 文件。对于入门学习,SQLite 非常方便。

步骤 8:体验 Django Admin 后台

Django 的 Admin 是其一大亮点。

```bash

(venv)

1. 创建一个超级用户 (用于登录 Admin 后台)

python manage.py createsuperuser

按照提示输入用户名、邮箱(可选)和密码

2. 注册模型到 Admin

打开 polls/admin.py 文件,添加以下内容:

from django.contrib import admin
from .models import Question, Choice # 导入你的模型

admin.site.register(Question) # 注册 Question 模型
admin.site.register(Choice) # 注册 Choice 模型

3. 重新运行开发服务器

python manage.py runserver

4. 访问 Admin 界面

在浏览器中打开 http://127.0.0.1:8000/admin/

使用刚才创建的超级用户账号登录

```

登录后,你就能看到一个管理界面,其中包含了 Polls 应用下的 QuestionsChoices。你可以在这里方便地添加、修改、删除问题和选项数据。

步骤 9:编写视图 (Views)

视图负责处理用户请求并返回响应。我们在 polls/views.py 中编写几个简单的视图。

```python

polls/views.py

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.urls import reverse
from .models import Question, Choice

视图函数接收 HttpRequest 对象作为参数,返回 HttpResponse 对象

def index(request):
# 获取最新的 5 个问题,按发布日期降序排列
latest_question_list = Question.objects.order_by('-pub_date')[:5]
# 构建上下文数据字典,用于传递给模板
context = {'latest_question_list': latest_question_list}
# 使用 render 快捷函数加载模板,并传递上下文,返回渲染后的 HttpResponse
return render(request, 'polls/index.html', context)

def detail(request, question_id):
# 尝试获取指定 ID 的 Question,如果不存在则抛出 404 错误
question = get_object_or_404(Question, pk=question_id)
# 同样使用 render 渲染详情页模板
return render(request, 'polls/detail.html', {'question': question})

def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/results.html', {'question': question})

def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
# request.POST 是一个类字典对象,可以获取 POST 请求提交的数据
# request.POST['choice'] 获取名为 'choice' 的表单数据的值 (即选项的 ID)
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# 如果 'choice' 不存在或对应的 Choice 不存在,重新显示问题详情页,并给出错误信息
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
# 如果找到选项,将其票数 +1 并保存
selected_choice.votes += 1
selected_choice.save()
# 成功处理 POST 请求后,通常建议返回 HttpResponseRedirect,
# 防止用户刷新页面导致重复提交。
# reverse() 函数根据 URL 名称动态生成 URL,避免硬编码。
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
```

步骤 10:定义 URL (URL Routing)

需要将 URL 路径映射到我们刚刚编写的视图函数。Django 的 URL 配置分为两层:项目层和应用层。

10.1 创建应用层 URL 配置 (polls/urls.py)

polls 目录下创建一个新的文件 urls.py

```python

polls/urls.py

from django.urls import path
from . import views # 从当前目录导入 views 模块

定义应用命名空间,方便在模板或视图中反向解析 URL

app_name = 'polls'

urlpatterns = [
# 路径: polls/ , 视图: views.index, URL 名称: 'index'
path('', views.index, name='index'),
# 路径: polls/5/ , 视图: views.detail, URL 名称: 'detail'
# 会捕获 URL 中的整数,并作为参数传递给视图函数
path('/', views.detail, name='detail'),
# 路径: polls/5/results/ , 视图: views.results, URL 名称: 'results'
path('/results/', views.results, name='results'),
# 路径: polls/5/vote/ , 视图: views.vote, URL 名称: 'vote'
path('/vote/', views.vote, name='vote'),
]
```

10.2 包含应用层 URL 到项目层 (mysite/urls.py)

修改项目的主 urls.py 文件 (mysite/urls.py),将 polls 应用的 URL 配置包含进来:

```python

mysite/urls.py

from django.contrib import admin
from django.urls import path, include # 引入 include 函数

urlpatterns = [
path('admin/', admin.site.urls),
# 当访问路径以 'polls/' 开头时,将后续部分交给 polls.urls 处理
path('polls/', include('polls.urls')),
# 你可以添加其他应用的 URL 配置,或项目级别的 URL
# path('', include('home.urls')), # 例如,包含一个名为 home 的应用的 URL
]
```

现在,访问 http://127.0.0.1:8000/polls/ 会调用 polls.views.index 视图,访问 http://127.0.0.1:8000/polls/1/ 会调用 polls.views.detail 视图(假设存在 ID 为 1 的 Question)。

步骤 11:创建模板 (Templates)

视图函数通常需要渲染 HTML 模板来生成用户界面。

polls 应用目录下创建一个 templates 目录,再在其中创建一个与应用同名的子目录 polls(这是 Django 查找模板的标准约定 app_name/templates/app_name/template_name.html):

polls/
├── templates/
│ └── polls/
│ ├── index.html
│ ├── detail.html
│ └── results.html
... (其他文件)

创建 index.html:

```html

{% if latest_question_list %}

Polls Index

{% else %}

No polls are available.

{% endif %}
```

  • {% ... %} 是模板标签,用于控制逻辑(如 if, for)。
  • {{ ... }} 是模板变量,用于显示视图传递过来的数据。
  • {% url 'polls:detail' question.id %} 是一个非常有用的模板标签,它会根据 polls/urls.py 中名为 detail 的 URL 模式,结合 question.id 参数,动态生成正确的 URL(例如 /polls/1/)。这避免了在模板中硬编码 URL。

创建 detail.html:

```html

{{ question.question_text }}

{% if error_message %}

{{ error_message }}

{% endif %}

{% csrf_token %}
{% for choice in question.choice_set.all %}


{% endfor %}

Back to poll list

View Results
```

  • {% csrf_token %} 必须放在所有使用 POST 方法的表单中,用于 Django 的 CSRF 保护。
  • question.choice_set.all 用于获取与当前 question 关联的所有 Choice 对象。
  • 表单的 action 指向 vote 视图的 URL,methodpost

创建 results.html:

```html

{{ question.question_text }}

    {% for choice in question.choice_set.all %}

  • {{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}
  • {% endfor %}

Vote again?

Back to poll list
```

  • {{ choice.votes|pluralize }} 是一个模板过滤器,如果 choice.votes 不等于 1,它会自动在 "vote" 后面添加 "s"。

现在,再次运行 python manage.py runserver,访问 http://127.0.0.1:8000/polls/。你应该能看到问题列表(如果 Admin 中添加了数据的话)。点击问题链接可以进入详情页,选择选项并投票,然后会跳转到结果页。

步骤 12:处理静态文件 (Static Files)

静态文件指 CSS、JavaScript、图片等不需要后端处理的文件。

  1. 配置 settings.py:
    确保 settings.py 中有以下设置(Django 默认通常已包含):

    ```python

    mysite/settings.py

    STATIC_URL = 'static/' # 静态文件在 URL 中的前缀

    (可选) 如果你的静态文件不在各个 app 的 'static/' 目录下,

    可以设置 STATICFILES_DIRS 告诉 Django 去哪里额外查找静态文件

    例如,在项目根目录创建一个名为 'static' 的文件夹放全局静态文件

    import os
    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
    ```

  2. 在应用中组织静态文件:
    polls 应用下创建 static 目录,再创建一个与应用同名的子目录 polls

    polls/
    ├── static/
    │ └── polls/
    │ └── style.css
    ... (其他文件)

    创建 polls/static/polls/style.css:

    css
    /* polls/static/polls/style.css */
    body {
    background-color: lightblue;
    }
    li a {
    color: green;
    }

  3. 在模板中加载静态文件:
    修改 polls/templates/polls/index.html (或其他模板),在顶部添加 {% load static %} 标签,然后使用 {% static 'path/to/file' %} 模板标签来生成静态文件的 URL:

    ```html

    {% load static %} {# 加载 static 标签库 #}

    {# 引用 CSS 文件 #}

    {% if latest_question_list %}

    Polls Index

    {% else %}

    No polls are available.

    {% endif %}
    ```

    现在刷新 http://127.0.0.1:8000/polls/ 页面,你应该能看到背景色变成了浅蓝色,链接变成了绿色。

五、 进阶学习方向

掌握了以上基础后,你可以继续深入学习 Django 的更多功能:

  1. 类视图 (Class-Based Views, CBVs):Django 提供了基于类的视图,可以更好地组织代码,实现复用,尤其适合处理常见的模式(如列表展示、详情、创建、更新、删除等)。
  2. 表单处理 (Forms API):学习 Django 强大的表单库,用于生成 HTML 表单、验证用户输入、处理表单数据。
  3. 用户认证与授权 (Authentication & Authorization):深入了解 Django 内置的用户系统,实现用户注册、登录、注销、密码管理以及权限控制。
  4. 数据库进阶:学习更复杂的 ORM 查询(Q 对象、F 对象、聚合、注解)、数据库关系(一对多、多对多、一对一)、数据库事务等。
  5. 测试 (Testing):编写单元测试和集成测试,确保代码质量和应用稳定性。
  6. 部署 (Deployment):学习如何将你的 Django 应用部署到生产环境(如使用 Gunicorn/uWSGI + Nginx/Apache,或部署到 PaaS 平台如 Heroku, PythonAnywhere)。
  7. 中间件 (Middleware):了解请求/响应处理流程中的中间件机制,用于实现全局功能(如日志记录、会话管理、安全检查)。
  8. 缓存 (Caching):学习使用 Django 的缓存框架提升应用性能。
  9. 信号 (Signals):当特定事件发生时(如模型保存前后),触发自定义动作。
  10. Django REST framework (DRF):如果需要构建 API 接口,DRF 是 Django 生态中最流行的库。
  11. 异步 Django (Async Views):利用 Python 的 async/await 语法编写异步视图,处理高并发 I/O 密集型任务。

六、 推荐学习资源

  1. Django 官方文档 (The Django documentation)https://docs.djangoproject.com/ - 最权威、最全面的学习资源,包含教程、主题指南、API 参考等。官方的投票应用教程 (Writing your first Django app) 是极好的起点。
  2. MDN Web Docs - Django 教程https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django - Mozilla 提供的 Django 系列教程,质量很高,适合初学者。
  3. 在线课程:Coursera, Udemy, edX 等平台上有许多 Django 相关的视频课程。
  4. 书籍:《Django for Beginners》、《Two Scoops of Django》、《Test-Driven Development with Python》等都是评价很高的 Django 书籍。
  5. 社区:Stack Overflow (django 标签)、Django Gitter/Discord 频道、Reddit (r/django) 等都是寻求帮助和交流的好地方。

结语

Django 是一个功能强大且设计优雅的 Web 框架。虽然初看起来概念较多,但只要遵循本指南的步骤,动手实践,你会发现其开发流程清晰、效率很高。从创建一个简单的投票应用开始,你已经迈出了成为一名 Django 开发者的重要一步。

学习 Django 是一个持续的过程,关键在于不断实践、阅读文档、参与社区。不要害怕犯错,每个错误都是学习的机会。希望这篇详尽的入门指南能为你打下坚实的基础,祝你在 Django 的世界里探索愉快,构建出色的 Web 应用!


THE END