Django 零基础入门教程
Django 是 Python 生态中最成熟、最强大的全栈 Web 框架
遵循「电池已内置」(Batteries Included)理念 , 内置 ORM、Admin 后台、用户认证、表单验证等全套功能 , 适合快速开发从个人项目到企业级应用的各类 Web 系统。
本教程从环境搭建到完整项目实战,带你零基础掌握 Django 核心用法。
一、前置准备
1.1 环境要求
- Python 3.8+(Django 4.x 及以上版本推荐,兼容更好)
- pip(Python 包管理工具,默认随 Python 安装)
- 操作系统:Windows/macOS/Linux 均可(本教程以 macOS/Linux 为例,Windows 仅命令行略有差异)
1.2 安装 Django
打开终端/命令提示符,执行以下命令安装最新稳定版 Django:
bash
# 安装最新版
pip install django
# 验证安装(查看版本,当前稳定版为 5.0+)
django-admin --version
可选:用虚拟环境隔离项目依赖(推荐)
bash# 创建虚拟环境 python -m venv django_env # 激活虚拟环境(macOS/Linux) source django_env/bin/activate # 激活虚拟环境(Windows) django_env\Scripts\activate # 激活后再安装 Django pip install django
二、Django 核心概念
在开始写代码前,先理解 Django 的核心设计理念和架构:
2.1 MTV 架构
Django 采用 MTV 模式(对应传统 MVC 架构),职责划分清晰:
| 组件 | 全称 | 作用 | 对应 MVC 中的角色 |
|---|---|---|---|
| Model(模型) | 数据模型 | 定义数据结构,操作数据库(增删改查) | Model |
| Template(模板) | 模板文件 | 定义页面展示样式(HTML+模板语法) | View |
| View(视图) | 视图函数/类 | 处理业务逻辑,连接 Model 和 Template | Controller |
2.2 项目与应用
- 项目(Project):一个完整的 Django 应用程序,包含全局配置、路由总入口、数据库配置等。
- 应用(App):项目的功能模块(如用户模块、商品模块),一个项目可包含多个 App,便于代码解耦。
2.3 核心组件
- URLconf:路由配置,映射 URL 地址到对应的视图函数。
- ORM:对象关系映射,用 Python 类操作数据库,无需写原生 SQL。
- Admin:自动生成的后台管理界面,快速管理数据库数据。
- Form:表单验证,处理前端提交的数据,自动校验合法性。
三、快速创建第一个 Django 项目
3.1 创建项目
执行以下命令创建名为 myfirstsite 的 Django 项目:
bash
django-admin startproject myfirstsite
执行后会生成如下目录结构:
bash
myfirstsite/ # 项目根目录
├── manage.py # 项目管理脚本(启动服务、创建App、数据库迁移等)
└── myfirstsite/ # 项目核心配置目录
├── __init__.py
├── asgi.py # ASGI 配置,适配异步 Web 服务器
├── settings.py # 全局配置文件(数据库、静态文件、应用注册等)
├── urls.py # 路由总入口
└── wsgi.py # WSGI 配置,适配传统 Web 服务器
3.2 创建应用
进入项目根目录,创建名为 blog 的应用(后续以博客功能为例):
bash
cd myfirstsite
python manage.py startapp blog
生成的 blog 目录结构:
bash
blog/
├── __init__.py
├── admin.py # 配置 Admin 后台
├── apps.py # 应用配置
├── migrations/ # 数据库迁移文件(自动生成)
├── models.py # 数据模型
├── tests.py # 单元测试
└── views.py # 视图函数
3.3 注册应用
打开 myfirstsite/settings.py,在 INSTALLED_APPS 中添加 blog 应用(Django 仅加载注册的应用):
python
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # 新增:注册 blog 应用
]
3.4 启动开发服务器
执行以下命令启动 Django 内置的开发服务器:
bash
python manage.py runserver
终端输出如下信息表示启动成功:
sql
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
Django version 5.0, using settings 'myfirstsite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
打开浏览器访问 http://127.0.0.1:8000/,看到 Django 默认欢迎页面,说明环境搭建成功。
四、核心功能实战:搭建简易博客
4.1 定义数据模型(Model)
打开 blog/models.py,定义博客文章(Article)模型,对应数据库中的 blog_article 表:
python
from django.db import models
from django.contrib.auth.models import User # 内置用户模型
# 博客文章模型
class Article(models.Model):
# 标题:字符串类型,最大长度 200,不允许为空
title = models.CharField(max_length=200, verbose_name="文章标题")
# 内容:文本类型,可存储大段文字
content = models.TextField(verbose_name="文章内容")
# 发布时间:自动设置为创建时间,无需手动赋值
pub_time = models.DateTimeField(auto_now_add=True, verbose_name="发布时间")
# 作者:关联内置 User 模型,一篇文章属于一个用户,用户删除则文章也删除(on_delete=models.CASCADE)
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="作者")
# 自定义显示名称(Admin 后台和终端中更易识别)
def __str__(self):
return self.title
# 元数据:设置模型的额外属性
class Meta:
verbose_name = "文章"
verbose_name_plural = "文章" # 复数形式(避免 Admin 显示为"Articles")
ordering = ["-pub_time"] # 按发布时间倒序排列(最新的在前)
4.2 数据库迁移
Django 通过「迁移文件」管理数据库结构,执行以下命令将模型同步到数据库:
bash
# 生成迁移文件(记录模型的变化)
python manage.py makemigrations
# 执行迁移(将模型创建为数据库表)
python manage.py migrate
说明:Django 默认使用 SQLite 数据库(无需额外配置),适合开发阶段;生产环境可替换为 MySQL/PostgreSQL(后续会讲)。
4.3 配置 Admin 后台
Django 内置的 Admin 后台可快速管理数据库数据,无需手动写增删改查页面。
4.3.1 注册模型到 Admin
打开 blog/admin.py,注册 Article 模型:
python
from django.contrib import admin
from .models import Article
# 注册 Article 模型
admin.site.register(Article)
4.3.2 创建超级用户(Admin 登录账号)
执行以下命令,按提示输入用户名、邮箱、密码:
bash
python manage.py createsuperuser
示例:
perl
Username (leave blank to use 'yourname'): admin
Email address: admin@example.com
Password: 输入强密码(如 Admin123!)
Password (again): 重复密码
Superuser created successfully.
4.3.3 访问 Admin 后台
重启开发服务器,访问 http://127.0.0.1:8000/admin/,输入超级用户账号密码登录。
登录后可看到「Articles」选项,点击即可添加、编辑、删除博客文章------这就是 Django 「电池已内置」的体现,几行代码实现完整的后台管理功能。
4.4 编写视图函数(View)
视图函数负责处理业务逻辑,接收请求并返回响应。
4.4.1 基础视图:展示所有文章
打开 blog/views.py,编写视图函数:
python
from django.shortcuts import render
from .models import Article
# 展示所有文章列表
def article_list(request):
# 从数据库查询所有文章(按发布时间倒序)
articles = Article.objects.all()
# 将文章数据传递给模板
return render(request, 'blog/article_list.html', {'articles': articles})
# 展示单篇文章详情
def article_detail(request, article_id):
# 根据 ID 查询单篇文章,若不存在则返回 404
article = Article.objects.get(id=article_id)
return render(request, 'blog/article_detail.html', {'article': article})
4.5 配置路由(URLconf)
路由负责映射 URL 到视图函数,分为「项目总路由」和「应用子路由」(推荐解耦)。
4.5.1 应用子路由
在 blog 目录下创建 urls.py 文件,编写应用内路由:
python
from django.urls import path
from . import views
urlpatterns = [
# 文章列表页:http://127.0.0.1:8000/blog/
path('', views.article_list, name='article_list'),
# 文章详情页:http://127.0.0.1:8000/blog/1/(1 为文章 ID)
path('<int:article_id>/', views.article_detail, name='article_detail'),
]
4.5.2 项目总路由
打开 myfirstsite/urls.py,将应用路由挂载到总路由:
python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), # Admin 后台路由
path('blog/', include('blog.urls')), # 挂载 blog 应用路由
]
4.6 编写模板(Template)
模板负责页面展示,使用 Django 模板语法将视图传递的数据渲染为 HTML。
4.6.1 创建模板目录
按以下结构创建模板目录(Django 默认读取 templates 目录下的模板):
bash
myfirstsite/
├── blog/
│ └── templates/ # 应用级模板目录(推荐)
│ └── blog/
│ ├── article_list.html # 文章列表模板
│ └── article_detail.html # 文章详情模板
└── manage.py
4.6.2 文章列表模板(article_list.html)
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>我的博客</title>
<style>
.article { margin: 20px 0; padding: 10px; border-bottom: 1px solid #eee; }
.title { font-size: 18px; color: #2c3e50; }
.pub-time { color: #999; font-size: 12px; }
</style>
</head>
<body>
<h1>我的博客</h1>
{% if articles %}
{% for article in articles %}
<div class="article">
<h2 class="title">
<a href="{% url 'article_detail' article.id %}">{{ article.title }}</a>
</h2>
<p class="pub-time">发布时间:{{ article.pub_time|date:"Y-m-d H:i" }}</p>
<p>作者:{{ article.author.username }}</p>
<p>{{ article.content|truncatechars:200 }}</p> <!-- 截取前200个字符 -->
</div>
{% endfor %}
{% else %}
<p>暂无文章,快去后台添加吧!</p>
{% endif %}
</body>
</html>
4.6.3 文章详情模板(article_detail.html)
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{ article.title }} - 我的博客</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<p>发布时间:{{ article.pub_time|date:"Y-m-d H:i" }} | 作者:{{ article.author.username }}</p>
<hr>
<div>{{ article.content|linebreaks }}</div> <!-- linebreaks 转换换行符为 <br> -->
<br>
<a href="{% url 'article_list' %}">返回首页</a>
</body>
</html>
4.7 测试功能
- 先通过 Admin 后台(
http://127.0.0.1:8000/admin/)添加几篇测试文章; - 访问
http://127.0.0.1:8000/blog/,可看到文章列表; - 点击文章标题,进入详情页查看完整内容。
至此,一个简易的博客系统已完成,包含「后台管理+前台展示」核心功能。
五、进阶功能:表单、用户认证与静态文件
5.1 静态文件配置(CSS/JS/图片)
Django 需配置静态文件目录,才能加载 CSS、JS、图片等资源。
5.1.1 创建静态文件目录
在 blog 目录下创建 static/blog/ 目录,用于存放该应用的静态文件:
csharp
blog/
└── static/
└── blog/
├── css/
│ └── style.css # 自定义样式
└── images/
└── logo.png # 示例图片
5.1.2 配置静态文件路径
打开 myfirstsite/settings.py,确认以下配置(默认已开启):
python
# 静态文件 URL 前缀
STATIC_URL = 'static/'
# 开发阶段静态文件目录(生产环境需收集到统一目录)
STATICFILES_DIRS = [
BASE_DIR / "static", # 项目级静态文件目录(可选)
]
5.1.3 在模板中引用静态文件
修改 article_list.html,引入自定义 CSS:
html
{% load static %} <!-- 加载静态文件标签 -->
<head>
<meta charset="UTF-8">
<title>我的博客</title>
<!-- 引用静态 CSS 文件 -->
<link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
<!-- 引用静态图片 -->
<img src="{% static 'blog/images/logo.png' %}" alt="博客logo" width="100">
<!-- 其余内容不变 -->
</body>
5.2 表单:添加文章评论功能
5.2.1 定义评论模型
打开 blog/models.py,新增 Comment 模型:
python
class Comment(models.Model):
# 评论内容
content = models.TextField(verbose_name="评论内容")
# 评论时间
create_time = models.DateTimeField(auto_now_add=True, verbose_name="评论时间")
# 关联文章(一篇文章可有多个评论)
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name="comments", verbose_name="所属文章")
# 关联用户(可选,匿名评论可去掉)
author = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="评论者")
def __str__(self):
return f"{self.author.username} 评论:{self.content[:20]}"
class Meta:
verbose_name = "评论"
verbose_name_plural = "评论"
ordering = ["-create_time"]
执行数据库迁移:
bash
python manage.py makemigrations
python manage.py migrate
5.2.2 定义评论表单
在 blog 目录下创建 forms.py,编写表单验证:
python
from django import forms
from .models import Comment
class CommentForm(forms.ModelForm):
# 自定义表单字段(可选,用于调整显示)
content = forms.CharField(widget=forms.Textarea(attrs={"rows": 3, "placeholder": "请输入评论..."}), label="")
class Meta:
model = Comment # 基于 Comment 模型创建表单
fields = ["content"] # 只显示 content 字段
5.2.3 修改视图:处理评论提交
更新 blog/views.py 的 article_detail 视图,添加表单处理逻辑:
python
from .forms import CommentForm
def article_detail(request, article_id):
article = Article.objects.get(id=article_id)
# 处理评论提交
if request.method == "POST":
# 验证用户是否登录(未登录则跳转到登录页)
if not request.user.is_authenticated:
from django.shortcuts import redirect
return redirect(f"/admin/login/?next=/blog/{article_id}/")
# 绑定表单数据
form = CommentForm(request.POST)
if form.is_valid(): # 验证数据合法性
comment = form.save(commit=False) # 不立即保存到数据库
comment.article = article # 关联所属文章
comment.author = request.user # 关联评论者(当前登录用户)
comment.save() # 保存到数据库
# 刷新页面(避免重复提交)
from django.shortcuts import redirect
return redirect(f"/blog/{article_id}/")
else:
# GET 请求:初始化空表单
form = CommentForm()
# 查询该文章的所有评论
comments = article.comments.all()
return render(request, 'blog/article_detail.html', {
'article': article,
'form': form,
'comments': comments
})
5.2.4 修改详情模板:添加评论表单和评论列表
更新 article_detail.html:
html
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>{{ article.title }} - 我的博客</title>
<link rel="stylesheet" href="{% static 'blog/css/style.css' %}">
</head>
<body>
<h1>{{ article.title }}</h1>
<p>发布时间:{{ article.pub_time|date:"Y-m-d H:i" }} | 作者:{{ article.author.username }}</p>
<hr>
<div>{{ article.content|linebreaks }}</div>
<br>
<!-- 评论表单 -->
<h3>评论区</h3>
<form method="POST">
{% csrf_token %} <!-- Django 必加:防止跨站请求伪造 -->
{{ form.as_p }} <!-- 渲染表单 -->
<button type="submit">提交评论</button>
</form>
<!-- 评论列表 -->
{% if comments %}
<div style="margin-top: 20px;">
{% for comment in comments %}
<div style="margin: 10px 0; padding: 10px; background: #f9f9f9;">
<p><strong>{{ comment.author.username }}</strong> {{ comment.create_time|date:"Y-m-d H:i" }}</p>
<p>{{ comment.content|linebreaks }}</p>
</div>
{% endfor %}
</div>
{% endif %}
<br>
<a href="{% url 'article_list' %}">返回首页</a>
</body>
</html>
5.3 用户认证(扩展)
Django 内置完整的用户认证系统,无需手动实现登录/注册:
- 登录页:
http://127.0.0.1:8000/admin/login/(Admin 自带); - 若需自定义登录页,可使用
django.contrib.auth模块的login/logout函数; - 视图中通过
request.user判断用户是否登录,request.user.is_authenticated返回布尔值。
六、生产环境配置(简要)
开发完成后,需调整配置适配生产环境:
6.1 数据库切换为 MySQL
- 安装 MySQL 驱动:
pip install mysqlclient; - 修改
settings.py的数据库配置:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myfirstsite', # 数据库名
'USER': 'root', # MySQL 用户名
'PASSWORD': 'your_mysql_password', # MySQL 密码
'HOST': '127.0.0.1', # 数据库地址
'PORT': '3306', # 端口
'CHARSET': 'utf8mb4', # 字符集(支持emoji)
}
}
6.2 关闭 DEBUG 模式
python
# settings.py
DEBUG = False # 生产环境必须关闭
ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com'] # 允许访问的域名
6.3 收集静态文件
bash
python manage.py collectstatic # 将所有静态文件收集到 STATIC_ROOT 目录
6.4 部署方式
- 小型应用:Gunicorn + Nginx;
- 大型应用:Docker + Kubernetes 或云服务(阿里云 ECS、腾讯云轻量应用服务器)。
七、常见问题与解决方案
-
报错:CSRF token missing or incorrect
原因:表单未加
{% csrf_token %};解决:在 POST 表单中添加
{% csrf_token %}标签。 -
报错:DoesNotExist: Article matching query does not exist
原因:访问了不存在的文章 ID;
解决:使用
get_object_or_404替代get:pythonfrom django.shortcuts import get_object_or_404 article = get_object_or_404(Article, id=article_id) -
静态文件加载失败
原因:未配置
STATIC_URL或未加载{% load static %};解决:确认
settings.py配置,模板开头添加{% load static %}。
八、学习资源与进阶方向
8.1 官方资源
- Django 官方文档:docs.djangoproject.com/(最权威,建议优先看)...
- Django 官方教程:docs.djangoproject.com/en/stable/i...
8.2 进阶方向
- 类视图(Class-Based Views):替代函数视图,复用性更高;
- Django REST Framework:开发 RESTful API,适配前后端分离;
- 中间件(Middleware):处理全局请求/响应(如日志、权限验证);
- 缓存与性能优化:使用 Redis 缓存高频访问数据;
- Celery 异步任务:处理耗时任务(如邮件发送、数据导出)。
总结
- 核心流程:Django 开发遵循「定义模型→数据库迁移→编写视图→配置路由→编写模板」的固定流程,MTV 架构让代码职责清晰;
- 核心优势:内置 Admin 后台、ORM、表单验证等功能,无需重复造轮子,开发效率极高;
- 学习路径:先掌握基础的「模型-视图-模板」,再逐步扩展表单、用户认证、静态文件,最后学习生产环境部署和性能优化。
Django 的生态足够支撑从个人博客到企业级电商平台的所有开发需求,掌握核心用法后,可结合实际项目持续进阶。