Django 教程入门指南
Django 入门指南:从零开始构建你的第一个 Web 应用
引言
在当今互联网时代,Web 开发已成为一项炙手可热的技能。而在众多 Web 框架中,基于 Python 的 Django 以其“自带电池”(Batteries Included)、高效开发、安全可靠、社区活跃等特性,受到了全球开发者的青睐。无论你是 Python 初学者希望涉足 Web 开发,还是有经验的开发者想要掌握一款强大的后端框架,Django 都是一个绝佳的选择。
本指南旨在为初学者提供一个清晰、详尽的 Django 入门路线图,从环境搭建到构建一个简单的 Web 应用,逐步揭开 Django 的神秘面纱。本文将涵盖 Django 的核心概念、基本操作流程以及学习过程中需要注意的关键点,力求让你在阅读后能够独立上手,开启你的 Django 开发之旅。
一、 为什么选择 Django?
在开始学习之前,了解选择 Django 的理由有助于增强学习动力:
- 快速开发 (Rapid Development):Django 遵循 DRY (Don't Repeat Yourself) 原则,提供了大量内置组件(如 ORM、管理后台、表单处理、认证系统等),开发者可以专注于业务逻辑,避免重复造轮子,从而大大提高开发效率。
- 功能完备 (Batteries Included):与其他微框架不同,Django 提供了构建复杂 Web 应用所需的大部分功能,无需开发者再去费力寻找和集成各种第三方库(当然,需要时也可以轻松集成)。
- 安全性 (Security):Django 内置了多种安全防护机制,能够有效抵御常见的 Web 攻击,如 CSRF(跨站请求伪造)、XSS(跨站脚本攻击)、SQL 注入等。框架的设计者们非常重视安全问题,并会及时发布安全补丁。
- 可扩展性 (Scalability):Django 的组件化设计使其具有良好的可扩展性。从小型个人项目到大型商业应用(如 Instagram、Pinterest、NASA 官网等),Django 都能胜任。它能够很好地与缓存系统、负载均衡器等配合工作。
- 强大的 ORM (Object-Relational Mapper):Django 的 ORM 允许开发者使用 Python 代码来操作数据库,而无需编写复杂的 SQL 语句。它支持多种主流数据库(PostgreSQL, MySQL, SQLite, Oracle),并且数据库迁移(Migrations)功能使得数据库结构变更管理变得简单可控。
- 完善的管理后台 (Admin Interface):只需几行代码,Django 就能自动生成一个功能强大的管理后台,方便网站管理员对数据进行增删改查操作,极大节省了后台管理功能的开发时间。
- 活跃的社区与丰富的文档 (Community & Documentation):Django 拥有一个庞大而活跃的全球开发者社区,遇到问题时很容易找到帮助。官方文档详尽且质量高,被誉为业界典范,是学习 Django 的最佳资源。
二、 学习 Django 的先决条件
在正式开始 Django 学习之前,你需要具备以下基础知识和工具:
- Python 基础:Django 是一个 Python 框架,因此你需要熟悉 Python 的基本语法、数据类型(列表、字典、元组、集合)、函数、类、模块和包等概念。了解面向对象编程(OOP)会对理解 Django 的设计更有帮助。
- 命令行/终端基础:Django 的许多操作(如创建项目、运行服务器、执行数据库迁移等)都需要通过命令行来完成。你需要熟悉基本的命令行操作(如
cd
,ls
/dir
,mkdir
,python
,pip
等)。 - HTML/CSS/JavaScript 基础 (可选但推荐):虽然 Django 主要负责后端逻辑,但 Web 应用最终需要通过 HTML 呈现给用户,用 CSS 美化样式,用 JavaScript 增加交互。了解这些前端基础知识将使你能够更好地构建完整的 Web 应用。
- 了解基本的 Web 概念:理解 HTTP 协议(请求/响应模型、GET/POST 方法)、URL、客户端/服务器架构等基本概念。
- 文本编辑器或 IDE:你需要一个代码编辑器来编写 Python 和 HTML 代码。流行的选择包括 VS Code、PyCharm、Sublime Text、Atom 等。
- Python 和 Pip 环境:确保你的电脑上安装了 Python(推荐较新稳定版本,如 Python 3.8+)以及包管理工具 Pip。可以通过在命令行输入
python --version
和pip --version
来检查。
三、 核心概念解析
在深入实践之前,先了解 Django 的几个核心概念:
-
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
文件中配置。
- Model (模型):负责与数据库交互,定义数据结构(对应数据库表),并包含业务逻辑。它通常是
-
项目 (Project) 与应用 (App):
- Project:代表一个完整的网站或 Web 应用程序。一个 Django 项目包含了一系列配置(如数据库设置、安装的应用列表、全局 URL 配置等)和若干个 App。
- App:代表项目中的一个特定功能模块(如博客模块、用户认证模块、论坛模块等)。一个 App 通常包含自己的 Models, Views, Templates 和 URLs。App 的设计理念是为了实现代码的复用性和模块化。一个 App 可以被用于多个不同的 Django 项目中。
-
ORM (Object-Relational Mapper):如前所述,它允许你用 Python 对象来操作数据库表,将数据库操作抽象化,提高开发效率和代码可读性,并能在一定程度上实现数据库解耦。
-
数据库迁移 (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.py
的 DATABASES
配置中可以看到),它会在项目根目录下创建一个 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
应用下的 Questions
和 Choices
。你可以在这里方便地添加、修改、删除问题和选项数据。
步骤 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'
#
path('
# 路径: polls/5/results/ , 视图: views.results, URL 名称: 'results'
path('
# 路径: polls/5/vote/ , 视图: views.vote, URL 名称: 'vote'
path('
]
```
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
-
{% for question in latest_question_list %}
- {{ question.question_text }}
{% endfor %}
{% 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 %}
Back to poll list
View Results
```
{% csrf_token %}
必须放在所有使用 POST 方法的表单中,用于 Django 的 CSRF 保护。question.choice_set.all
用于获取与当前question
关联的所有Choice
对象。- 表单的
action
指向vote
视图的 URL,method
为post
。
创建 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、图片等不需要后端处理的文件。
-
配置
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'),]
``` -
在应用中组织静态文件:
在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;
} -
在模板中加载静态文件:
修改polls/templates/polls/index.html
(或其他模板),在顶部添加{% load static %}
标签,然后使用{% static 'path/to/file' %}
模板标签来生成静态文件的 URL:```html
{# 引用 CSS 文件 #}
{% load static %} {# 加载 static 标签库 #}{% if latest_question_list %}
Polls Index
-
{% for question in latest_question_list %}
- {{ question.question_text }}
{% endfor %}
{% else %}
No polls are available.
{% endif %}
```现在刷新
http://127.0.0.1:8000/polls/
页面,你应该能看到背景色变成了浅蓝色,链接变成了绿色。
五、 进阶学习方向
掌握了以上基础后,你可以继续深入学习 Django 的更多功能:
- 类视图 (Class-Based Views, CBVs):Django 提供了基于类的视图,可以更好地组织代码,实现复用,尤其适合处理常见的模式(如列表展示、详情、创建、更新、删除等)。
- 表单处理 (Forms API):学习 Django 强大的表单库,用于生成 HTML 表单、验证用户输入、处理表单数据。
- 用户认证与授权 (Authentication & Authorization):深入了解 Django 内置的用户系统,实现用户注册、登录、注销、密码管理以及权限控制。
- 数据库进阶:学习更复杂的 ORM 查询(Q 对象、F 对象、聚合、注解)、数据库关系(一对多、多对多、一对一)、数据库事务等。
- 测试 (Testing):编写单元测试和集成测试,确保代码质量和应用稳定性。
- 部署 (Deployment):学习如何将你的 Django 应用部署到生产环境(如使用 Gunicorn/uWSGI + Nginx/Apache,或部署到 PaaS 平台如 Heroku, PythonAnywhere)。
- 中间件 (Middleware):了解请求/响应处理流程中的中间件机制,用于实现全局功能(如日志记录、会话管理、安全检查)。
- 缓存 (Caching):学习使用 Django 的缓存框架提升应用性能。
- 信号 (Signals):当特定事件发生时(如模型保存前后),触发自定义动作。
- Django REST framework (DRF):如果需要构建 API 接口,DRF 是 Django 生态中最流行的库。
- 异步 Django (Async Views):利用 Python 的
async/await
语法编写异步视图,处理高并发 I/O 密集型任务。
六、 推荐学习资源
- Django 官方文档 (The Django documentation):https://docs.djangoproject.com/ - 最权威、最全面的学习资源,包含教程、主题指南、API 参考等。官方的投票应用教程 (Writing your first Django app) 是极好的起点。
- MDN Web Docs - Django 教程:https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django - Mozilla 提供的 Django 系列教程,质量很高,适合初学者。
- 在线课程:Coursera, Udemy, edX 等平台上有许多 Django 相关的视频课程。
- 书籍:《Django for Beginners》、《Two Scoops of Django》、《Test-Driven Development with Python》等都是评价很高的 Django 书籍。
- 社区:Stack Overflow (django 标签)、Django Gitter/Discord 频道、Reddit (r/django) 等都是寻求帮助和交流的好地方。
结语
Django 是一个功能强大且设计优雅的 Web 框架。虽然初看起来概念较多,但只要遵循本指南的步骤,动手实践,你会发现其开发流程清晰、效率很高。从创建一个简单的投票应用开始,你已经迈出了成为一名 Django 开发者的重要一步。
学习 Django 是一个持续的过程,关键在于不断实践、阅读文档、参与社区。不要害怕犯错,每个错误都是学习的机会。希望这篇详尽的入门指南能为你打下坚实的基础,祝你在 Django 的世界里探索愉快,构建出色的 Web 应用!