Django 完整入门教程:从零开始构建你的第一个博客
目录
- 什么是 Django?
- 为什么选择 Django?
- 环境准备
- 第一步:创建项目和第一个应用
- 第二步:定义数据模型
- 第三步:创建和管理后台
- 第四步:配置 URL 和视图
- 第五步:创建模板
- 第六步:处理表单和用户交互
- 第七步:部署上线(可选)
- 总结与进阶
什么是 Django?
Django 是一个用 Python 编写的高级 Web 框架,它遵循“不要重复自己”(Don't Repeat Yourself, DRY)的原则,旨在帮助开发者快速、安全地构建复杂的数据库驱动的网站。

你可以把 Django 想象成一个“汽车车身底盘”,它已经为你准备好了发动机、变速箱、底盘、悬挂等核心部件(用户认证、后台管理、ORM、路由系统等),你只需要专注于设计和安装你自己的车身和内饰(即你的业务逻辑和页面),就能快速造出一辆可用的汽车。
为什么选择 Django?
- 快速开发:Django 提供了大量的开箱即用的功能,让你能专注于业务逻辑,而不是重复造轮子。
- “自带电池”:框架自带了许多 Web 开发中常见的需求,如:
- 强大的后台管理:几行代码就能自动生成一个功能齐全的后台。
- ORM (Object-Relational Mapper):用 Python 类来操作数据库,无需编写复杂的 SQL 语句。
- 用户认证系统:处理用户注册、登录、注销等。
- 安全性:默认防止常见的 Web 攻击,如 CSRF、XSS、SQL 注入等。
- URL 路由:优雅地将 URL 映射到视图函数。
- 可扩展性:从一个小型博客到像 Instagram、Pinterest 这样的大型网站,Django 都能轻松应对。
- 庞大的社区:遇到问题时,你很容易在 Stack Overflow、GitHub 等社区找到帮助。
环境准备
在开始之前,请确保你的电脑上已经安装了 Python 和 pip,你可以在终端(或命令提示符)中运行以下命令来检查:
python --version pip --version
强烈建议:为每个项目创建一个独立的虚拟环境,以避免不同项目之间的包版本冲突。
-
创建并激活虚拟环境
(图片来源网络,侵删)-
macOS / Linux:
# 创建一个名为 myblog 的虚拟环境 python3 -m venv myblog # 激活虚拟环境 source myblog/bin/activate
-
Windows:
# 创建一个名为 myblog 的虚拟环境 python -m venv myblog # 激活虚拟环境 .\myblog\Scripts\activate
激活后,你的终端提示符前面会出现
(myblog),表示虚拟环境已生效。
-
-
安装 Django 在激活的虚拟环境中,使用 pip 安装 Django:
(图片来源网络,侵删)pip install django
第一步:创建项目和第一个应用
Django 项目由多个“应用”(App)组成,一个应用是一个专门用于处理某项功能的 Web 模块,比如博客、商店、论坛等。
-
创建项目 我们使用
django-admin命令来创建一个名为myblog_project的项目。django-admin startproject myblog_project
这会创建一个
myblog_project文件夹,里面包含了项目的核心配置文件。 -
进入项目目录
cd myblog_project
-
创建应用 现在我们来创建一个博客应用,我们称之为
blog。python manage.py startapp blog
你会看到多了一个
blog文件夹,这就是我们的应用。 -
注册应用 Django 需要知道要加载哪些应用,打开
myblog_project/settings.py文件,找到INSTALLED_APPS列表,将我们的blog应用添加进去:# myblog_project/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', # 添加这一行 ] -
运行开发服务器 让我们启动一下开发服务器,看看一切是否正常。
python manage.py runserver
在浏览器中访问
http://127.0.0.1:8000/,你应该能看到 Django 的欢迎页面。
第二步:定义数据模型
模型是数据的唯一、权威的信息来源,它包含了你的数据字段的定义和行为,我们将为博客创建两个模型:Post(文章)和 Category(分类)。
-
编辑
blog/models.py打开blog应用下的models.py文件,添加以下代码:# blog/models.py from django.db import models from django.contrib.auth.models import User class Category(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blog_posts') category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, related_name='posts') def __str__(self): return self.title__str__(self):定义了对象的字符串表示形式,方便在后台识别。ForeignKey:定义了一个多对一的关系,一篇文章只能有一个作者,但一个作者可以有多篇文章。on_delete=models.CASCADE:当关联的作者被删除时,该文章也会被删除。related_name:允许我们通过反向关系查询,user.blog_posts.all()。
-
创建和应用数据库迁移 Django 通过“迁移”来同步你的模型定义到数据库。
-
生成迁移文件:
python manage.py makemigrations
你会看到 Django 为我们创建了一个新的迁移文件。
-
应用迁移,创建数据库表:
python manage.py migrate
你的数据库中已经生成了
blog_post和blog_category等表。
-
第三步:创建和管理后台
Django 最强大的功能之一就是其自动生成的后台管理界面,我们可以用它来管理文章和分类。
-
创建超级用户 为了登录后台,我们需要一个管理员账户。
python manage.py createsuperuser
按照提示输入用户名、邮箱和密码。
-
注册模型到后台 打开
blog/admin.py文件,将我们的模型注册进去:# blog/admin.py from django.contrib import admin from .models import Post, Category admin.site.register(Category) admin.site.register(Post)
-
测试后台
- 确保开发服务器正在运行 (
python manage.py runserver)。 - 在浏览器中访问
http://127.0.0.1:8000/admin/。 - 使用你刚刚创建的超级用户名和密码登录。
- 你现在可以看到 "Posts" 和 "Categories" 选项,点击 "Add" 来添加一些分类和文章,测试一下!
- 确保开发服务器正在运行 (
第四步:配置 URL 和视图
URL 是网站的地址,视图是处理请求并返回响应的函数,我们将配置 URL 路由,并创建视图来显示文章列表和详情页。
-
创建视图函数 编辑
blog/views.py文件:# blog/views.py from django.shortcuts import render, get_object_or_404 from .models import Post, Category def post_list(request): posts = Post.objects.all().order_by('-created_at') categories = Category.objects.all() context = { 'posts': posts, 'categories': categories, } return render(request, 'blog/post_list.html', context) def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) categories = Category.objects.all() context = { 'post': post, 'categories': categories, } return render(request, 'blog/post_detail.html', context)render:一个快捷函数,用于加载模板并返回一个 HttpResponse 对象。get_object_or_404:如果对象不存在,返回 404 错误页面,非常方便。
-
配置应用的 URL 在
blog应用目录下,创建一个名为urls.py的新文件:# blog/urls.py from django.urls import path from . import views urlpatterns = [ path('', views.post_list, name='post_list'), path('post/<int:pk>/', views.post_detail, name='post_detail'), ]path('', ...):空路径,对应网站的首页,会调用post_list视图。path('post/<int:pk>/', ...):匹配类似/post/1/这样的 URL,<int:pk>会捕获一个整数作为文章的主键,并传递给post_detail视图。
-
配置项目的 URL 我们需要告诉主项目
myblog_project如何处理 URL 请求,打开myblog_project/urls.py文件,修改如下:# myblog_project/urls.py from django.contrib import admin from django.urls import path, include # 导入 include urlpatterns = [ path('admin/', admin.site.urls), path('', include('blog.urls')), # 添加这一行,将根路径下的请求交给 blog.urls 处理 ]include('blog.urls'):将所有以 开头的请求,都转发到blog应用的urls.py文件中进行进一步匹配。
现在访问 http://127.0.0.1:8000/,你会看到一个 TemplateDoesNotExist 错误,因为我们还没有创建模板。
第五步:创建模板
模板是包含 HTML 代码和 Django 模板语言的文件,用于动态生成页面。
-
创建模板目录结构 在
blog应用目录下,创建templates/blog/文件夹,Django 会自动在这个路径下查找模板。blog/templates/blog/post_list.htmlpost_detail.html
-
创建
post_list.html编辑blog/templates/blog/post_list.html文件:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>我的博客</title> <style> body { font-family: sans-serif; margin: 40px; } .post { border: 1px solid #ccc; padding: 10px; margin-bottom: 20px; border-radius: 5px; } .post h2 { margin-top: 0; } .post a { text-decoration: none; color: #007bff; } </style> </head> <body> <h1>我的博客</h1> <h2>分类</h2> <ul> {% for category in categories %} <li><a href="#">{{ category.name }}</a></li> {% endfor %} </ul> <hr> <h2>所有文章</h2> {% for post in posts %} <div class="post"> <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2> <p>作者: {{ post.author.username }}</p> <p>发布时间: {{ post.created_at|date:"Y-m-d H:i" }}</p> <p>{{ post.content|truncatewords:30 }}</p> </div> {% empty %} <p>暂无文章。</p> {% endfor %} </body> </html>{% for ... %}:循环标签。{{ variable }}:变量标签。{% url 'post_detail' pk=post.pk %}:使用name='post_detail'的 URL,并动态传递pk参数,这是 Django 的最佳实践。
-
创建
post_detail.html编辑blog/templates/blog/post_detail.html文件:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>{{ post.title }}</title> <style> body { font-family: sans-serif; margin: 40px; } .post { max-width: 800px; margin: auto; } .post h1 { color: #333; } .post-meta { color: #777; font-size: 0.9em; } </style> </head> <body> <div class="post"> <h1>{{ post.title }}</h1> <p class="post-meta">作者: {{ post.author.username }} | 发布时间: {{ post.created_at|date:"Y-m-d H:i" }}</p> <hr> <p>{{ post.content }}</p> </div> <a href="{% url 'post_list' %}">返回首页</a> </body> </html>
现在刷新你的浏览器,你应该能看到一个漂亮的博客首页,并且可以点击文章标题进入详情页了!
第六步:处理表单和用户交互
让我们添加一个功能:允许登录的用户发表评论。
-
创建评论模型 编辑
blog/models.py,添加Comment模型:# blog/models.py # ... (保留之前的代码) from django.utils import timezone class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') author = models.ForeignKey(User, on_delete=models.CASCADE) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return f'Comment by {self.author} on {self.post}' -
重新生成并应用迁移
python manage.py makemigrations python manage.py migrate
-
注册评论模型到后台 编辑
blog/admin.py:# blog/admin.py # ... (保留之前的代码) from .models import Post, Category, Comment admin.site.register(Category) admin.site.register(Post) admin.site.register(Comment) # 添加这一行
-
更新详情页模板以显示评论 编辑
blog/templates/blog/post_detail.html,在文章内容下方添加:<!-- ... 在文章内容 <p>{{ post.content }}</p> 后面添加 ... --> <hr> <h3>评论 ({{ post.comments.count }})</h3> {% for comment in post.comments.all %} <div style="border: 1px solid #eee; padding: 10px; margin-bottom: 10px; border-radius: 5px;"> <p><strong>{{ comment.author.username }}</strong> ({{ comment.created_at|date:"Y-m-d H:i" }})</p> <p>{{ comment.body }}</p> </div> {% empty %} <p>暂无评论。</p> {% endfor %} <!-- ... 在返回首页链接前添加评论表单 ... --> <hr> <h3>发表评论</h3> <form action="{% url 'post_detail' pk=post.pk %}" method="post"> {% csrf_token %} {{ comment_form.as_p }} <button type="submit">提交评论</button> </form>{% csrf_token %}:Django 的跨站请求伪造保护,非常重要!
-
创建视图来处理评论 编辑
blog/views.py:# blog/views.py from django.shortcuts import render, get_object_or_404, redirect from .models import Post, Category, Comment from .forms import CommentForm # 我们马上会创建这个表单 # ... (保留 post_list 和 post_detail 函数) def post_detail(request, pk): post = get_object_or_404(Post, pk=pk) categories = Category.objects.all() # 处理评论表单 if request.method == 'POST': comment_form = CommentForm(data=request.POST) if comment_form.is_valid(): new_comment = comment_form.save(commit=False) new_comment.post = post new_comment.author = request.user new_comment.save() return redirect('post_detail', pk=post.pk) else: comment_form = CommentForm() context = { 'post': post, 'categories': categories, 'comment_form': comment_form, # 将表单添加到上下文 } return render(request, 'blog/post_detail.html', context) -
创建评论表单 在
blog应用目录下创建一个forms.py文件:# blog/forms.py from django import forms from .models import Comment class CommentForm(forms.ModelForm): class Meta: model = Comment fields = ('body',)Django Forms 可以根据模型自动生成表单字段,非常方便。
-
更新详情页模板以正确使用表单 修改
blog/templates/blog/post_detail.html中的表单部分:<!-- ... 修改评论表单部分 ... --> <h3>发表评论</h3> <form method="post"> {% csrf_token %} {{ comment_form.body }} <button type="submit">提交评论</button> </form>- 我们直接使用
{{ comment_form.body }}来渲染评论内容输入框,你也可以使用{{ comment_form.as_p }}来渲染所有字段。
- 我们直接使用
你可以登录一个普通用户(或者用超级用户),在文章详情页发表评论了!
第七步:部署上线(可选)
当你的应用开发完成后,你可能希望将其部署到公共服务器上,让任何人都能访问,这是一个复杂的话题,但基本流程如下:
- 选择一个云服务器:如 Heroku, PythonAnywhere, DigitalOcean, AWS 等。
- 环境配置:在服务器上安装 Python 和你的项目依赖(
pip freeze > requirements.txt)。 - 数据库迁移:在服务器上运行
python manage.py migrate。 - 静态文件处理:使用
python manage.py collectstatic将所有静态文件(CSS, JS, 图片)收集到一个地方。 - 使用 WSGI 服务器:如 Gunicorn 或 uWSGI,来运行你的 Django 应用。
- 使用反向代理:如 Nginx,来处理静态文件请求并将动态请求转发给 WSGI 服务器。
这个过程有大量细节,建议在熟悉 Django 基础后,再专门学习部署相关的教程。
总结与进阶
恭喜你!你已经成功使用 Django 从零开始构建了一个功能完整的博客应用,你学会了:
- 如何创建项目和应用。
- 如何定义和使用数据模型。
- 如何利用 Django 后台管理数据。
- 如何配置 URL、编写视图和创建模板。
- 如何处理表单和用户交互。
接下来可以学习什么?
- 用户认证系统:集成 Django 内置的用户注册、登录、注销、密码修改等功能。
- 表单进阶:创建更复杂的自定义表单,进行数据验证。
- 类视图:学习 Django 的基于类的视图,它们能让你的代码更简洁、可重用。
- REST Framework:学习如何使用 Django REST framework 构建强大的 API。
- 测试:为你的应用编写单元测试和集成测试,确保代码质量。
- 缓存:使用缓存来提高网站性能。
Django 的世界非常广阔,希望这份教程能为你打开一扇门,祝你编码愉快!
