1. 前置动作
1.1 基础项目介绍
如我前面的系列博客进行的操作,我之前创建了一个 名为 learn_django 的项目,并简单添加了如下内容:
- 环境配置(python、Django包 等)
- 初始化的数据库
- pages APP
- Home 页面
- About 页面
上述过程产生的文件结构如下:
text
├── .venv/
├── learn_django/ # django 项目基础
├── pages/ # APP 1: pages
├── templates/ # html 模版
├── db.sqlite3 # 初始数据库
├── requirements.txt # 依赖的 python 包
└── manage.py
接下来我在这个项目的基础上继续进行开发
1.2 创建 posts APP
- 自动化创建文件
bash
cd 项目路径
python manage.py startapp posts
- 配置到 learn_django/settings.py 中
python
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"pages",
"posts", # <=== new
]
2. 模型(涉及数据库)
2.1 Django 模型简介
Django ORM(对象关系映射器),- 它内置支持多种数据库后端:
- PostgreSQL
- MySQL
- MariaDB
- Oracle
- SQLite。
- 开发者可以在
models.py文件中编写相同的 Python 代码- 这些代码会自动被转换为每个数据库的正确 SQL。
- 唯一需要配置的是更新
django_project/settings.py文件中的DATABASES
- 对于本地开发,Django 默认使用
SQLite- 因为它是
基于文件的,因此比其他需要独立服务器来运行的数据库选项要简单得多
- 因为它是
- 它内置支持多种数据库后端:
2.2 首次修改 models.py
修改 posts/models.py,体会模型修改的过程
- posts/models.py
python
from django.db import models
class Post(models.Model):
text = models.TextField()
2.3 Django 模型的更新
每当我们创建或修改现有模型时,都需要通过两步流程更新 Django:
-
- 创建迁移文件
-
使用 makemigrations 命令
-
迁移文件会记录数据库模型的任何更改,这意味着我们可以随时间跟踪更改,并在必要时调试。
-
命令(以 posts APP 为例)
bashpython manage.py makemigrations posts -
注:
- 在运行 makemigrations 时,你不必指定名称。
- 此时 Django 会为项目中所有的变更创建一个迁移文件。
- 在只有单个应用的小型项目中这是可以的
- 大多数 Django 项目都有多个应用。
- 如果你在多个应用中做了模型更改,那么不指定应用名时,生成的迁移文件将包含所有这些更改
- 迁移文件应该尽可能小且简明,以便将来更容易调试,甚至根据需要回滚更改。
- 因此,作为一个最佳实践,
养成在执行 makemigrations 命令时始终包含应用名称的习惯!
- 在运行 makemigrations 时,你不必指定名称。
-
- 构建数据库
- 使用 migrate 命令
- 该命令会执行迁移文件中的指令
- 命令
bash
python manage.py migrate
2.4 Django 后台管理
- 功能简介
- Django 有一个强大的
管理界面,可以直观地与数据交互。 - 这一功能的出现源于 Django 最初作为一个报纸内容管理系统(CMS)而起。
- 最初的想法是记者可以在管理后台撰写和编辑他们的报道,而无需接触"代码"。
- 随着时间的推移,内置的管理应用已经发展成一个出色的开箱即用工具,用于管理 Django 项目的各个方面。
- Django 有一个强大的
- 代码:posts/admin.py
python
from django.contrib import admin
from .models import Post
admin.site.register(Post)
- 命令行
bash
python manage.py createsuperuser
- 填写相关信息

- 启动服务(不赘述)
- 进入页面:http://127.0.0.1:8000/admin/
在该页面上,即可通过之前设置的用户名、密码 进行登录

注意:图中红框标记的 POSTS 这个部分是修改过 posts/admin.py 才会出现的。
2.5 创建第一条数据
-
点击 Posts 旁边的 "+ADD"
-
填入文本内容并保存

-
如何将数据条目的名称进行合理修改?
- 现在数据条目的名称是"Post object (1)"
- 修改代码使其显示内容的 前50个字符:
python
from django.db import models
class Post(models.Model):
text = models.TextField()
def __str__(self):
return self.text[:50]

3. 修改主页
- 就像我前面几篇博客介绍的那样,现在需要一个可视化的主页,我们需要处理的有:
- 模版
- 图视
- URL 配置
- 由于我是基于之前的项目进行的修改,所以
- 一些已经改过的代码(例如 settings.py 中的)就不需要写了
- 一些老的页面需要改动(之前的 pages APP 中的页面)
3.1 模版
- templates/home.html 修改
html
<!-- templates/home.html -->
{% extends "base.html" %}
{% block content %}
<h1>Homepage</h1>
<h2>Message board homepage</h2>
<ul>
{% for post in post_list %}
<li>{{ post.text }}</li>
{% endfor %}
</ul>
{% endblock content %}
3.2 Views
- posts/views.py
python
from django.views.generic import ListView
from .models import Post
class HomePageView(ListView):
model = Post
template_name = "home.html"
3.3 urls
- posts/urls.py
python
from django.urls import path
from .views import HomePageView
urlpatterns = [
path("", HomePageView.as_view(), name="home"),
]
- learn_django/urls.py
python
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("pages.urls")),
path("", include("posts.urls")), # <=== new
]
3.4 测试代码
- posts/tests.py
python
from django.test import TestCase
from django.urls import reverse
class HomepageTests(TestCase):
def test_url_exists_at_correct_location(self):
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
def test_url_available_by_name(self):
response = self.client.get(reverse("home"))
self.assertEqual(response.status_code, 200)
def test_template_name_correct(self):
response = self.client.get(reverse("home"))
self.assertTemplateUsed(response, "home.html")
def test_template_content(self):
response = self.client.get(reverse("home"))
self.assertContains(response, "<h1>Homepage</h1>")
self.assertContains(response, "<h2>Message board homepage</h2>")
3.5 修改之前的 pages APP
-
由于我的 posts APP 中创建了名为 "home" 的主页面。而之前的 pages APP 中也有这个页面,以及另一个 about 页面。现在我要保留的是:
- posts APP 中的 "home" 页面
- pages APP 中的 "about" 页面
-
因此 pages APP 需要删掉和 "home" 相关的东西。同样是这些步骤:
- 模型:不涉及
- 模版:不需要修改,因为 posts APP 已经改过了
- 图视:删掉 home 相关代码
- urls:删掉 home 相关代码
- 测试代码:删掉 home 相关代码
4. 验证
接下来我进行如下验证:
- 运行测试程序:OK
- 启动服务,访问页面:OK
- 在管理员界面添加一个"test 2" 数据:OK
最终我的页面效果如下:

5. 上库
接下来把我的项目更新提交到 github。
过程我不赘述了,本次涉及的改动如下:

附录
还是那句话,记住下面这张图对把握开发过程很有帮助:
