【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。

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

附录

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

相关推荐
oradh1 分钟前
Oracle 19c 单机安装总结_linux8
数据库·oracle·oracle 19c·oracle安装
瀚高PG实验室1 分钟前
瀚高数据库使用IPv6连接的配置方法
数据库·瀚高数据库
pupudawang2 分钟前
mysql之联合索引
数据库·mysql
刘晨鑫13 分钟前
MySQL的初步认识和安装
数据库·mysql
今儿敲了吗4 分钟前
python基础学习笔记第四章
c++·笔记·python·学习
User_芊芊君子4 分钟前
风险可视可防,金仓数据库 SQL 防火墙筑牢企业数据安全防线
后端
电商API&Tina4 分钟前
淘宝商品视频的采集需要注意哪些问题||item_video-获得淘宝商品视频
大数据·网络·数据库·人工智能·python·音视频
czlczl200209255 分钟前
Redis集群批处理下的陷阱
数据库·redis·缓存
别看我只是一直狼5 分钟前
Spring Boot + Redis 实战:8 个企业项目最常用代码模板
后端
悲伤小伞5 分钟前
6-MySQL_表的内置函数
数据库·mysql