【Web应用开发笔记】Django笔记4-1:简单使用 Django 与本地数据库

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:

    1. 创建迁移文件
    • 使用 makemigrations 命令

    • 迁移文件会记录数据库模型的任何更改,这意味着我们可以随时间跟踪更改,并在必要时调试。

    • 命令(以 posts APP 为例)

      bash 复制代码
       python manage.py makemigrations posts
    • 注:

      • 在运行 makemigrations 时,你不必指定名称。
        • 此时 Django 会为项目中所有的变更创建一个迁移文件。
        • 在只有单个应用的小型项目中这是可以的
      • 大多数 Django 项目都有多个应用。
        • 如果你在多个应用中做了模型更改,那么不指定应用名时,生成的迁移文件将包含所有这些更改
        • 迁移文件应该尽可能小且简明,以便将来更容易调试,甚至根据需要回滚更改。
        • 因此,作为一个最佳实践,养成在执行 makemigrations 命令时始终包含应用名称的习惯
    1. 构建数据库
    • 使用 migrate 命令
    • 该命令会执行迁移文件中的指令
    • 命令
bash 复制代码
python manage.py migrate

2.4 Django 后台管理

  • 功能简介
    • Django 有一个强大的管理界面,可以直观地与数据交互
    • 这一功能的出现源于 Django 最初作为一个报纸内容管理系统(CMS)而起。
      • 最初的想法是记者可以在管理后台撰写和编辑他们的报道,而无需接触"代码"。
    • 随着时间的推移,内置的管理应用已经发展成一个出色的开箱即用工具,用于管理 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。

过程我不赘述了,本次涉及的改动如下:

附录

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

相关推荐
齐生11 小时前
网络知识点 - TCP/IP 四层模型知识大扫盲
笔记·ios
树獭叔叔1 小时前
05-从隐藏向量到文字:LM Head如何输出"下一个词"?
后端·aigc·openai
绝无仅有1 小时前
计算机网络核心面试知识深入解析
后端·面试·架构
树獭叔叔1 小时前
03-大模型的非线性变化:从MLP到MOE,大模型2/3的参数都在这里
后端·aigc·openai
开发者小天2 小时前
python安装 Matplotlib 库 安装 Seaborn 库
开发语言·python·matplotlib
with-the-flow2 小时前
从数学底层的底层原理来讲 random 的函数是怎么实现的
c语言·python·算法
iOS开发上架2 小时前
系统架构-进程管理
python·腾讯云
轩情吖2 小时前
MySQL初识
android·数据库·sql·mysql·adb·存储引擎
多恩Stone2 小时前
【3D-AICG 系列-15】Trellis 2 的 O-voxel Shape: Flexible Dual Grid 代码与论文对应
人工智能·python·算法·3d·aigc
weixin_448119942 小时前
Datawhale 大模型算法全栈基础篇 202602第4次笔记
笔记·算法