[内容] Django 单表数据的修改 (MariaDB 版)

注意:

1) 在修改 Django MariaDB&MySQL 数据之前要先创建一个链接了 MariaDB 数据库或 MySQL 数据库的 Django 项目

2) 对于本文而言,必须要先完成内容一里的内容,再完成内容二里的内容,才能继续完成内容三里的内容

正文:

内容目录:

内容一:配置 Django 环境
1.1 进入 Python 环境
1.2 引入 os 模块和 django 模块
1.3 调用 mysite.settings 的配置
1.4 让刚刚的调用生效
1.5 调用 mysite 项目 movies 应用 models 模块里的所有内容

内容二:设置一个显示上一句 SQL 语句的函数

内容三:Django MariaDB&MySQL 数据的修改
3.1 方法一
3.1.1 方法一修改数据的操作
3.1.2 显示方法一修改数据的 SQL 语句
3.2 方法二
3.2.1 方法二修改数据的操作
3.2.2 显示方法二修改数据的 SQL 语句

具体的内容:

内容一:配置 Django 环境
1.1 进入 Python 环境

(django_env) [root@python mysite]# python3

1.2 引入 os 模块和 django 模块

>>> import os,django

1.3 调用 mysite.settings 的配置

>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'

1.4 让刚刚的调用生效

>>> django.setup()

1.5 调用 mysite 项目 movies 应用 models 模块里的所有内容

>>> from movies.models import *

内容二:设置一个显示上一句 SQL 语句的函数

>>> def showsql():
...     from django.db import connection
...     print(connection.queries[-1]['sql'])

(补充:这里的 [-1] 是指显示上一条操作的 SQL 语句)

内容三:Django MariaDB&MySQL 数据的修改
3.1 方法一
3.1.1 方法一修改数据的操作

>>> newitem = Movies.objects.last()
>>> newitem.mname='newtest'
>>> newitem.save()


补充:这里以
1) 将 movies 表里最后一条数据的
2) mname 字段的值修改为 newtest
3) mdesc 字段的值修改为 Animation, UHD, Dolby Vision,Dolby Atmos
4) mimg 字段的值修改为 eternalcenter.com/news/image
5) mlink 字段的值修改为 eternalcenter.com/news
为例

3.1.2 显示方法一修改数据的 SQL 语句

>>> showsql()
UPDATE `movies` SET `mname` = 'newtest', `mdesc` = 'Animation, UHD, Dolby Vision,Dolby Atmos', `mimg` = 'eternalcenter.com/news/image', `mlink` = 'eternalcenter.com/news' WHERE `movies`.`mid` = 5


补充:这里以
1) 将 movies 表里最后一条数据的
2) mname 字段的值修改为 newtest
3) mdesc 字段的值修改为 Animation, UHD, Dolby Vision,Dolby Atmos
4) mimg 字段的值修改为 eternalcenter.com/news/image
5) mlink 字段的值修改为 eternalcenter.com/news
为例

3.2 方法二
3.2.1 方法二修改数据的操作

>>> Movies.objects.filter(mid=5).update(mname='newtest2')
1

(补充:这里以将 movies 表里 mid 字段等于 5 的 mname 字段修改为 newtest2 为例)

3.2.2 显示方法二修改数据的 SQL 语句

>>> showsql()
UPDATE `movies` SET `mname` = 'newtest2' WHERE `movies`.`mid` = 5

(补充:这里以将 movies 表里 mid 字段等于 5 的 mname 字段修改为 newtest2 为例)

[内容] Django 模型层 Models Layer 常用数据库字段

内容目录:

内容一:Django Models 常用的文本字段
1.1 CharField() 字符串字段
1.1.1 CharField() 字符串字段的格式
1.1.2 CharField() 字符串字段的必选项
1.1.3 CharField() 字符串字段的可选项
1.1.4 CharField() 字符串字段的使用案例
1.2 TextField() 文本字段
1.2.1 TextField() 文本字段的格式
1.2.2 TextField() 文本字段的必选项
1.2.3 TextField() 文本字段的可选项
1.2.4 TextField() 文本字段的使用案例

内容二:Django Models 常用的数值字段
2.1 IntegerField() 整数字段
2.1.1 IntegerField() 整数字段的格式
2.1.2 IntegerField() 整数字段的可选项
2.1.3 IntegerField() 整数字段的使用案例
2.2 PositiveIntegerFiled() 正整数字段
2.2.1 PositiveIntegerFiled() 正整数字段的格式
2.2.2 PositiveIntegerFiled() 正整数字段的可选项
2.2.3 PositiveIntegerFiled() 正整数字段的使用案例
2.3 DecimalField() 小数字段
2.3.1 DecimalField() 小数字段的格式
2.3.2 DecimalField() 小数字段的必选项
2.2.3 DecimalField() 小数字段的使用案例

内容三:Django Models 常用的日期字段
3.1 DateField() 日期字段
3.1.1 DateField() 日期字段的格式
3.1.2 DateField() 日期字段的可选项
3.1.3 DateField() 日期字段的使用案例
3.2 DateTimeField() 日期时间字段
3.2.1 DateTimeField() 日期时间字段的格式
3.2.2 DateTimeField() 日期时间字段的可选项
3.2.3 DateTimeField() 日期时间字段的使用案例

内容四:Django Models 常用的标准格式字段
4.1 GenericIPAddressField() IPv4 地址字段
4.1.1 GenericIPAddressField() IPv4 地址字段的格式
4.1.2 GenericIPAddressField() IPv4 地址字段的使用案例
4.2 EmailField() 邮件地址字段
4.2.1 EmailField() 邮件地址字段的格式
4.2.2 EmailField() 邮件地址字段的可选项
4.2.3 EmailField() 邮件地址字段的使用案例
4.3 UUIDField() UUID 字段
4.3.1 UUIDField() UUID 字段的格式
4.3.2 UUIDField() UUID 字段的案例

内容五:Django Models 常用的逻辑字段
5.1 AutoField() 自动递增字段
5.1.1 AutoField() 自动递增字段的格式
5.1.2 AutoField() 自动递增的可选项
5.1.3 AutoField() 自动递增的使用案例
5.2 BooleanField() 布尔(boolean)值字段
5.2.1 BooleanField() 布尔(boolean)值字段的格式
5.2.2 BooleanField() 布尔(boolean)值字段的可选项
5.2.3 BooleanField() 布尔(boolean)值字段的案例

内容六:Django Models 常用的外部资源字段
6.1 FileField() 文件字段
6.1.1 FileField() 文件字段的格式
6.1.2 FileField() 文件字段的必选项
6.1.3 FileField() 文件字段的可选项
6.1.4 FileField() 文件字段的使用案例
6.2 URLField() URL 字段
6.2.1 URLField() URL 字段的格式
6.2.2 URLField() URL 字段的可选项
6.2.3 URLField() URL 字段的使用案例
6.3 ImageField() 图片字段
6.3.1 ImageField() 图片字段的格式
6.3.2 ImageField() 图片字段的可选项
6.3.3 ImageField() 图片字段的使用案例

具体的内容:

内容一:Django Models 常用的文本字段
1.1 CharField() 字符串字段
1.1.1 CharField() 字符串字段的格式

<field> = models.CharField(max_length = <string length>, <option>)

1.1.2 CharField() 字符串字段的必选项

max_length = <text length>

或者:

max_length = None

1.1.3 CharField() 字符串字段的可选项

1) blank = True

值可以为空


2) null = True

值可以为空


3) default = '<default value>'

值可以为空,可以设置成其他的值


4) unique = True

值唯一

1.1.4 CharField() 字符串字段的使用案例

item = models.CharField(max_length = 20, unique = True)

(补充:这里以设置名为 item,且是唯一的 CharField() 字符串字段为例)

1.2 TextField() 文本字段
1.2.1 TextField() 文本字段的格式

<field> = models.TextField(max_length = <string length>, <option>)

1.2.2 TextField() 文本字段的必选项

max_length = <text length>

或者:

max_length = None

1.2.3 TextField() 文本字段的可选项

1) blank = True

值可以为空


2) null = True

值可以为空


3) default = '<default value>'

值可以为空,可以设置成其他的值


4) unique = True

值唯一

1.2.4 TextField() 文本字段的使用案例

item = models.TextField(max_length = 20, unique = True)

(补充:这里以设置名为 item,且是唯一的 TextField() 文本字段为例)

内容二:Django Models 常用的数值字段
2.1 IntegerField() 整数字段
2.1.1 IntegerField() 整数字段的格式

<field> = models.IntegerField(<option>)

2.1.2 IntegerField() 整数字段的可选项

1) blank = True

值可以为空


2) null = True

值可以为空


3) default = '<default value>'

值可以为空,可以设置成其他的值

2.1.3 IntegerField() 整数字段的使用案例

item = models.IntegerField()

(补充:这里以设置名为 item 的整数字段为例)

2.2 PositiveIntegerFiled() 正整数字段
2.2.1 PositiveIntegerFiled() 正整数字段的格式

<field> = models.IntegerField(<option>)

2.2.2 PositiveIntegerFiled() 正整数字段的可选项

1) blank = True

值可以为空


2) null = True

值可以为空


3) default = '<default value>'

值可以为空,可以设置成其他的值

2.2.3 PositiveIntegerFiled() 正整数字段的使用案例

item = models.TextField()

(补充:这里以设置名为 item 的正整数字段为例)

2.3 DecimalField() 小数字段
2.3.1 DecimalField() 小数字段的格式

<field> = models.DecimalField(max_digits = <total number of decimal places>, decimal_places = <how many places after the decimal point>)

2.3.2 DecimalField() 小数字段的必选项

1) max_digits = <total number of decimal places>

小数字段总共位数

2) decimal_places = <how many places after the decimal point>

小数字段小数点后保留几位

2.2.3 DecimalField() 小数字段的使用案例

item = models.DecimalField(max_digits = 5, decimal_places = 2)

(补充:这里以设置名为 item,长度为 5,小数点后保留 2 位的 DecimalField() 小数字段为例)

内容三:Django Models 常用的日期字段
3.1 DateField() 日期字段
3.1.1 DateField() 日期字段的格式

<field> = models.DateField(<option>)

3.1.2 DateField() 日期字段的可选项

auto_now = True

自动更新创建时间

3.1.3 DateField() 日期字段的使用案例

item = models.DateField(auto_now_add=True)

(补充:这里以设置名为 item,可自动更新的 DateField() 日期字段为例)

3.2 DateTimeField() 日期时间字段
3.2.1 DateTimeField() 日期时间字段的格式

<field> = models.DateTimeField(<option>)

3.2.2 DateTimeField() 日期时间字段的可选项

auto_now = True

自动更新创建时间

3.2.3 DateTimeField() 日期时间字段的使用案例

item = models.DateTimeField(auto_now_add=True)

(补充:这里以设置名为 item,可自动更新的 DateTimeField() 日期时间字段为例)

内容四:Django Models 常用的标准格式字段
4.1 GenericIPAddressField() IPv4 地址字段
4.1.1 GenericIPAddressField() IPv4 地址字段的格式

<field> = models.IPAddressField()


补充:
在老的 Django 版本里,此字段的真实名称是:

models.IPAddressField()
)

4.1.2 GenericIPAddressField() IPv4 地址字段的使用案例

item = models.IPAddressField()

(补充:这里以设置名为 item 的 IPAddressField() IPv4 地址字段为例)


补充:
在老的 Django 版本里,此字段的真实名称是:

models.IPAddressField()
)

4.2 EmailField() 邮件地址字段
4.2.1 EmailField() 邮件地址字段的格式

<field> = models.EmailField(<option>)

4.2.2 EmailField() 邮件地址字段的可选项

unique = True

值唯一

4.2.3 EmailField() 邮件地址字段的使用案例

item = models.EmailField(unique = True)

(补充:这里以设置名为 item 的,且是唯一的 EmailField() 邮件地址字段为例)

4.3 UUIDField() UUID 字段
4.3.1 UUIDField() UUID 字段的格式

<field> = models.UUIDField()

4.3.2 UUIDField() UUID 字段的案例

item = models.UUIDField()

(补充:这里以设置名为 item 的 UUIDField() UUID 字段为例)

内容五:Django Models 常用的逻辑字段
5.1 AutoField() 自动递增字段
5.1.1 AutoField() 自动递增字段的格式

<field> = models.AutoField(<option>)

5.1.2 AutoField() 自动递增的可选项

primary_key = True

设置为主键

5.1.3 AutoField() 自动递增的使用案例

item = models.AutoField(primary_key = True)

(补充:这里以设置名为 item 的,且设置为主键的 AutoField() 自动递增字段为例)

5.2 BooleanField() 布尔(boolean)值字段
5.2.1 BooleanField() 布尔(boolean)值字段的格式

<field> = models.BooleanField(<option>)

5.2.2 BooleanField() 布尔(boolean)值字段的可选项

default=<default value>

(补充:设置布尔(boolean)值的默认值,默认值可选项有且只有:True 和 False)

5.2.3 BooleanField() 布尔(boolean)值字段的案例

item = models.BooleanField(default=False)

(补充:这里以设置名为 item 的,且默认值为 False 的布尔(boolean)值字段为例)

内容六:Django Models 常用的外部资源字段
6.1 FileField() 文件字段
6.1.1 FileField() 文件字段的格式

<field> = models.FileField(upload_to = "<directory/file>", <option>)

6.1.2 FileField() 文件字段的必选项

upload_to='<directory/file>'

6.1.3 FileField() 文件字段的可选项

max_length = '<length size>'

6.1.4 FileField() 文件字段的使用案例

item = models.FileField(upload_to ="./file", max_length = '4096')

(补充:这里以设置名为 item 的,读取本地的 ./file 文件,大小为 4096 的 FileField() 文件字段为例)

6.2 URLField() URL 字段
6.2.1 URLField() URL 字段的格式

<field> = models.URLField(max_length=<URL size>, <option>)

6.2.2 URLField() URL 字段的可选项

1) verify_exists = True

默认值为 True,如果 URL 不存在,则会返回 404


2) max_length=<URL size>

默认值为 200

6.2.3 URLField() URL 字段的使用案例

item = models.URLField(max_length= 200)

(补充:这里以设置名为 items 的,大小的为 200 的 URLField() URL 字段为例)

6.3 ImageField() 图片字段
6.3.1 ImageField() 图片字段的格式

item = models.ImageField(upload_to = "<directory/file>", <option>)

6.3.2 ImageField() 图片字段的可选项

1) height_field = <height size>
2) width_field = <width size>
3) max_length = <image size>

6.3.3 ImageField() 图片字段的使用案例

item = models.ImageField(upload_to = "./file")

(补充:这里以设置名为 item 的,读取本地的 ./file 文件的 ImageField() 图片字段为例)

参考文献:

https://docs.djangoproject.com/en/3.2/ref/models/fields/

[实验] Django 页码功能的实现

注意:

文中的 python 系统名、mysite 项目和 movies 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤目录:

步骤一:系统环境要求

步骤二:安装 Django
2.1 安装 Python3
2.2 创建并进入 Django 项目的目录
2.3 将 Django 项目的目录指定为 Django 环境
2.4 进入 Django 环境

步骤三:创建 mysite 项目
3.1 创建 mysite 项目
3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件
3.2.2 显示 mysite 项目的目录
3.3.3 Django 项目目录介绍

步骤四:创建 users 应用
4.1 创建 users 应用
4.2 users 应用的目录
4.2.1 显示 users 应用的目录
4.2.2 Django 应用目录介绍

步骤五:实现 movies 应用的层级多链接
5.1 在 mysite 应用中添加一个链接并链接 movies 应用的链接
5.2 在 mysite 应用中导入 movies 应用

步骤六:实现连接 MariaDB 数据库
6.1 安装 MairaDB 数据库和客户端
6.2 安装 Django 连接 MariaDB 的模块
6.3 在 mysite 应用中添加 Django 连接 MariaDB 的模块
6.4 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.4.1 进入 MairaDB 数据库
6.4.2 创建用于 Django 的库
6.4.3 创建用于 Django 的表
6.4.3.1 进入用于 Django 到库
6.4.3.2 创建用于 Django 的表
6.4.3.3 查看刚创建的表的表结构
6.4.4 创建用于 Django 的数据
6.4.4.1 进入用于 Django 到库
6.4.4.2 创建用于 Django 的数据
6.4.4.3 查看刚刚创建的数据
6.4.5 创建用于 Django 的用户
6.4.5.1 创建用于 Django 到用户
6.4.5.2 刷新权限
6.5 退出 MariaDB 数据库
6.6 重启 MariaDB 数据库

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块
7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块
7.3 在 mysite 应用中设置连接到 MariaDB 数据库

步骤八:根据数据库表结构生成 Django 数据库模型

步骤九:实现页码功能
9.1 在 movies 应用中添加一个页码功能的 HTML 模板
9.2 在 movies 应用中添加一个网页返回值的模块并实现所需功能
9.3 在 movies 应用中添加一个链接并设置对应的模块

步骤十:启动 Django 服务

步骤十一:测试页码功能

具体的操作步骤:

步骤一:系统环境要求

1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网

步骤二:安装 Django
2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

2.2 创建并进入 Django 项目的目录

[root@python ~]# mkdir project
[root@python ~]# cd project

2.3 将 Django 项目的目录指定为 Django 环境

[root@python project]# python3 -m venv django_env

2.4 进入 Django 环境

[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django

(补充:在此次操作发生时,最新的 Django 版本是 3.2)

步骤三:创建 mysite 项目
3.1 创建 mysite 项目

(django_env) [root@python project]# django-admin startproject mysite

3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件

(django_env) [root@python project]# zypper -n install tree

3.2.2 显示 mysite 项目的目录

(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

3.3.3 Django 项目目录介绍

1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口

步骤四:创建 users 应用
4.1 创建 users 应用

(django_env) [root@python mysite]# django-admin startapp movies

4.2 users 应用的目录
4.2.1 显示 users 应用的目录

(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── movies
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

3 directories, 13 files

4.2.2 Django 应用目录介绍

1) movies/app.py 此 Django 应用的容器
2) movies/__init__.py 空文件,通知 python 此项目是一个 python 包
3) movies/admin.py 此 Django 应用自带的后台管理相关的类
4) movies/app.py 此 Django 应用指定应用名的文件
5) movies/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) movies/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) movies/test.py 此 Django 应用的测试文档
8) movies/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

步骤五:实现 movies 应用的层级多链接
5.1 在 mysite 应用中添加一个链接并链接 movies 应用的链接

创建 mysite/movies/urls.py 并添加以下内容:

#coding=utf-8
from django.conf.urls import url, include
from users.views import register

urlpatterns = [
    url(r'^movies/', include('movies.urls')),
]

(补充:这里以设置 page 链接对应 movies 应用的链接为例)

5.2 在 mysite 应用中导入 movies 应用

在 mysite/mysite/settings.py 中添加以下内容:

......
INSTALLED_APPS = [
......
    'movies',
]
......

步骤六:实现连接 MariaDB 数据库
6.1 安装 MairaDB 数据库和客户端

(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client

6.2 安装 Django 连接 MariaDB 的模块

(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql

6.3 在 mysite 应用中添加 Django 连接 MariaDB 的模块

在 mysite/mysite/__init__.py 中添加以下内容:

......
import pymysql
pymysql.install_as_MySQLdb()

6.4 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.4.1 进入 MairaDB 数据库

(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p

6.4.2 创建用于 Django 的库

MariaDB [(none)]> create databases movies;

(补充:这里以创建 movies 库为例)

6.4.3 创建用于 Django 的表
6.4.3.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.4.3.2 创建用于 Django 的表

MariaDB [movies]> create table movies(mid INT AUTO_INCREMENT,mname VARCHAR(100) NOT NULL,mdesc TEXT,mimg VARCHAR(120) NOT NULL,mlink VARCHAR(200) NOT NULL,PRIMARY KEY( mid ),UNIQUE( mname ));
Query OK, 0 rows affected (0.058 sec)


补充:这利以创建
1) mid 是 INT 字段,且自动增加
2) mname 是 VARCHAR 字段,长度为 100,且非空
3) mdesc 是 TEXT 字段,长度为 120,且非空
4) mlink 是 VARCHAR 字段,长度为 200,且非空
5) mid 为主键
6) mname 不能重复
为例

6.4.3.3 查看刚创建的表的表结构

MariaDB [movies]> desc movies; 
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| mid   | int(11)      | NO   | PRI | NULL    | auto_increment |
| mname | varchar(100) | NO   | UNI | NULL    |                |
| mdesc | text         | YES  |     | NULL    |                |
| mimg  | varchar(120) | NO   |     | NULL    |                |
| mlink | varchar(200) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
5 rows in set (0.001 sec)

(补充:这里以查看 movies 表的表结构为例)

6.4.4 创建用于 Django 的数据
6.4.4.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.4.4.2 创建用于 Django 的数据

MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Titanic","Accidents and love story, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/titanic/image","eternalcenter.com/titanic");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("World War","Science fiction, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/world-war/image","eternalcenter.com/world-war");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Maleficent","Magic, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/maleficent/image","eternalcenter.com/maleficent");
Query OK, 1 row affected (0.012 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Cars","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/cars/image","eternalcenter.com/cars");
Query OK, 1 row affected (0.011 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("News","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/news/image","eternalcenter.com/news");
Query OK, 1 row affected (0.011 sec)

(补充:这里以符合 movies 表结构的规范,随意向 movies 插入 5 条数据为例)

6.4.4.3 查看刚刚创建的数据

MariaDB [movies]> select * from movies;
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
| mid | mname      | mdesc                                                   | mimg                               | mlink                        |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
|   1 | Titanic    | Accidents and love story, UHD, Dolby Vision,Dolby Atmos | eternalcenter.com/titanic/image    | eternalcenter.com/titanic    |
|   3 | World War  | Science fiction, UHD, Dolby Vision,Dolby Atmos          | eternalcenter.com/world-war/image  | eternalcenter.com/world-war  |
|   4 | Maleficent | Magic, UHD, Dolby Vision,Dolby Atmos                    | eternalcenter.com/maleficent/image | eternalcenter.com/maleficent |
|   5 | Cars       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/cars/image       | eternalcenter.com/cars       |
|   6 | News       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/news/image       | eternalcenter.com/news       |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
5 rows in set (0.000 sec)

(补充:这里以查看 movies 表里的所有数据为例)

6.4.5 创建用于 Django 的用户
6.4.5.1 创建用于 Django 到用户

MariaDB [(movies)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

(补充:这里以创建 root 用户,密码是 password 为例)

6.4.5.2 刷新权限

MariaDB [(movies)]> flush privileges;

6.5 退出 MariaDB 数据库

MariaDB [(none)]> exit

6.6 重启 MariaDB 数据库

(django_env) [root@python mysite]# systemctl restart mariadb

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块

(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql

7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块

在 mysite/mysite/__init__.py 中添加以下内容:

import pymysql
pymysql.install_as_MySQLdb()

7.3 在 mysite 应用中设置连接到 MariaDB 数据库

将 mysite/mysite/settings.py 中的以下内容:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
......

修改为:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'movies',
        'HOST': '127.0.0.1’,
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}
......


补充:这里以
1) 使用的库是 movies
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例

步骤八:根据数据库表结构生成 Django 数据库模型

(django_env) [root@python mysite]# python3 manage.py inspectdb>movies/models.py

步骤九:实现页码功能
9.1 在 movies 应用中添加一个页码功能的 HTML 模板

创建 mysite/movies/templates/movies/index.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        <!--avoid collapse after floating-->
        .clearfix{
                zoom:1;
        }
        .clearfix:after{
                content: "";display: block;visibility: hidden;line-height: 0;clear: both;
        }

        body,div{
            margin:0 auto;
        }

        div{
            border:1px solid gray;
            width:750px;
            text-align: center;
        }

        ul{
            list-style-type: none;
            display: inline-block;
        }


        #header li{
            float: left;
            margin-left:10px;
            font-size:16px;
            font-family: 'Microsoft elegant black';
            color: #666666;

        }
        #header li:hover{
            cursor: pointer;
            background:blue;
            color: white;
        }

        #content li{
            float: left;
            display: inline;
            margin-right:15px;
            text-align: center;
            height:225px;
            overflow: hidden;
            padding-top:10px;
            padding-bottom:5px;

        }
        #content h1{
            font-size:14px;
            margin:0;

        }

        .tip{
            display: block;
            font-size:12px;
        }

       .h1,.tip{
            width:110px;
           text-align: center;
        }
        
        #content ul{
            /*remove the inner and outer margins of UL*/
            margin:0;
            padding:0;

        }
    </style>

</head>
<body>
    <div id="header"  class="clearfix">
        <ul class="clearfix">
            <li>home page</li>
            <li>record</li>
            <li>love</li>
            <li>ethic</li>
            <li>comic</li>
            <li>science fiction</li>
            <li>history</li>
            <li>warfare</li>
            <li>short film</li>
            <li>natural</li>
        </ul>
    </div>
    <div id="content" >
        <ul class="clearfix">
            {% for movie in nowpage %}
                <li>
                    <a href="{{ movie.mlink }}"><img src="{{ movie.mimg }}"/></a>
                    <h1 class="h1">{{ movie.mname }}</h1>
                    <span class="tip">{{ movie.mdesc }}</span>
                </li>
            {% endfor %}
        </ul>
    </div>
    <div>
        <a href="/movies/?page=1">Home</a>
        <!—show home page—>

        {% if nowpage.has_previous %}
            <a href="/movies/?page={{ nowpage.previous_page_number }}">prepage</a>
        {% endif %}
        <!--show previous page when current page exists-->

        {% for tnum in pagelist %}
            {% if currentpage == tnum %}
                <a href="/movies/?page={{ tnum }}" style="font-size: 28px;color:red;">{{ tnum }}</a>&emsp;
                <!--font size and red when page number equals current page-->
            {% else %}
                <a href="/movies/?page={{ tnum }}">{{ tnum }}</a>&emsp;
            {% endif %}          
        {% endfor %}
        <!--displays the page numbers of five pages before and after the current page-->

        {% for num in items.page_range %}
            {% if currentpage == tnum %}
                <a href="/movies/?page={{ tnum }}" style="font-size: 28px;color:red;">{{ tnum }}</a>&emsp;
                <!--when the number of page numbers equals the current page, the font becomes large and red-->
            {% else %}
                <a href="/movies/?page={{ tnum }}">{{ tnum }}</a>&emsp;
            {% endif %}
        {% endfor %}
        <!--show all page numbers-->

        {% if nowpage.has_next %}
            <a href="/movies/?page={{ nowpage.next_page_number }}">nextpage</a>
        {% endif %}
        <!--display the next page when it exists-->

        <a href="/movies/?page={{ items.num_pages }}">Last</a>
        <!—show end page—>
    </div>
</body>
</html>


补充:这里主要以
1) 生成一个展示每条数据的 mlink 字段、mimg 字段、mname 字段 和 mdesc 字段的表格,且每条数据就是一个表格
2) 显示首页和尾页并为其设置对应的链接
3) 在当前页的前提下,如果有前一页或后一页,则显示出来并为其设置对应的链接
4) 显示当前页前后五页页码并为其设置对应的链接
5) 显示全部页码并为其设置对应的链接
为例

9.2 在 movies 应用中添加一个网页返回值的模块并实现所需功能

在 mysite/movies/views.py 中添加以下内容:

......
from .models import Movies
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
import math
......

def movies(request):

    page = request.GET.get('page',1)

    page = int(page)
    #Convert page to an integer

    movies = Movies.objects.all()
    #Read all data

    items = Paginator(movies,3)
    #Creating a pager object
 
    try:
        nowpage = items.page(page)
        #Get current page number
    except PageNotAnInteger:
        nowpage = items.page(1)
        #When page is not a numeric value, the data of the first page is returned
    except EmptyPage:
        nowpage = items.page(items.num_pages)
        #Returns the data of the last page when the number of pages corresponding to the page value does not exist

    beginpage = (page-int(math.ceil(10.0/2)))
    if beginpage < 1:
        beginpage = 1
    #Let beginpage be equal to the current page. When beginpage is less than 5, it is equal to 1

    endpage = beginpage + 9
    if endpage > items.num_pages:
        endpage = items.num_pages
    #When endpage is equal to beginpage plus 9, if endpage is greater than the maximum number of pages, it is equal to the maximum number of pages

    if endpage <= 10:
        beginpage = 1
    else:
        beginpage = endpage - 9
    #Let begingpage equal to endpage minus 9

    pagelist = range(beginpage,endpage+1)
    #Pagelist is from beginpage to endpage to array. The result of range (1,3) is [1,2] instead of [1,2,3]

    return render(request,'movies/index.html',{'items':items,'nowpage':nowpage,'pagelist':pagelist,'currentpage':page})


补充:这里主要以:
1) 设置 movies 模块并返回 movies/index.html
2) 从 movies/index.html 中获取 page 值,且当 page 值不存在时,其默认值为 1,并将其强行转换成整数
3) 这里的 movies = Movies.objects.all() 是指将 Movies 模块对应数据库里的所有数据导入给 movies 变量
4) 调用 Paginator 模块将 movies 变量生成每页为 3 条数据的分页的 items 对象,并将当前页数据赋予给 nowpage 变量
5) 调用 PageNotAnInteger 模块当页码不是一个数值时返回页码是 1 的数据
6) 调用 EmptyPage 模块当页码不存在时返回最后 1 页的数据
7) 利用逻辑将 pagelist 变量设置成当前页前后 5 页的页码
8) 给予 movies/index.html items、nowpage、pagelist 和 currentage 变量,同时将对应的值赋予给它们
为例

9.3 在 movies 应用中添加一个链接并设置对应的模块

创建 mysite/movies/urls.py 并添加以下内容:

#coding=utf-8
from django.conf.urls import url
from movies.views import movies

urlpatterns = [
    url(r'^$', movies),
]

(补充:这里以设置空链接链接对应 movies 模块为例)

步骤十:启动 Django 服务

(django_env) [root@python mysite]# python3 manage.py runserver

步骤十一:测试页码功能

1) 打开浏览器输入以下网址:

http://127.0.0.1:8000/movies/

2) 可以看到对应的展示模版有 3 条数据
3) 可以看到首页和尾页的链接
4) 可以看到前 1 页和后 1 页的链接(如果有的话)
5) 可以看到当前页前后 5 页的链接(如果有的话)
6) 可以看到所有页的链接

[实验] Django 分页展示功能的实现 (Django 版)

注意:

文中的 python 系统名、mysite 项目和 movies 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤目录:

步骤一:系统环境要求

步骤二:安装 Django
2.1 安装 Python3
2.2 创建并进入 Django 项目的目录
2.3 将 Django 项目的目录指定为 Django 环境
2.4 进入 Django 环境

步骤三:创建 mysite 项目
3.1 创建 mysite 项目
3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件
3.2.2 显示 mysite 项目的目录
3.3.3 Django 项目目录介绍

步骤四:创建 movies 应用
4.1 创建 movies 应用
4.2 movies 应用的目录
4.2.1 显示 movies 应用的目录
4.2.2 Django 应用目录介绍
4.3 在 mysite 应用中导入 movies 应用

步骤五:实现 movies 应用的层级多链接

步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 MairaDB 数据库和客户端
6.2 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.2.1 进入 MairaDB 数据库
6.2.2 创建用于 Django 的库
6.2.3 创建用于 Django 的表
6.2.3.1 进入用于 Django 到库
6.2.3.2 创建用于 Django 的表
6.2.3.3 查看刚创建的表的表结构
6.2.4 创建用于 Django 的数据
6.2.4.1 进入用于 Django 到库
6.2.4.2 创建用于 Django 的数据
6.2.4.3 查看刚刚创建的数据
6.2.5 创建用于 Django 的用户
6.2.5.1 创建用于 Django 到用户
6.2.5.2 刷新权限
6.3 退出 MariaDB 数据库
6.4 重启 MariaDB 数据库

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块
7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块
7.3 在 mysite 应用中设置连接到 MariaDB 数据库

步骤八:根据数据库表结构生成 Django 数据库模型

步骤九:实现分页展示功能
9.1 在 movies 应用中添加一个分页展示功能的 HTML 模板
9.2 在 movies 应用中添加一个网页返回值的模块并从数据库里分页读取数据
9.3 在 movies 应用中添加一个链接并设置对应的模块

步骤十:启动 Django 服务

步骤十一:测试分页展示功能

具体的操作步骤:

步骤一:系统环境要求

1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网

步骤二:安装 Django
2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

2.2 创建并进入 Django 项目的目录

[root@python ~]# mkdir project
[root@python ~]# cd project

2.3 将 Django 项目的目录指定为 Django 环境

[root@python project]# python3 -m venv django_env

2.4 进入 Django 环境

[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django

(补充:在此次操作发生时,最新的 Django 版本是 3.2)

步骤三:创建 mysite 项目
3.1 创建 mysite 项目

(django_env) [root@python project]# django-admin startproject mysite

3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件

(django_env) [root@python project]# zypper -n install tree

3.2.2 显示 mysite 项目的目录

(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

3.3.3 Django 项目目录介绍

1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口

步骤四:创建 movies 应用
4.1 创建 movies 应用

(django_env) [root@python mysite]# django-admin startapp movies

4.2 movies 应用的目录
4.2.1 显示 movies 应用的目录

(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── movies
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

3 directories, 13 files

4.2.2 Django 应用目录介绍

1) movies/app.py 此 Django 应用的容器
2) movies/__init__.py 空文件,通知 python 此项目是一个 python 包
3) movies/admin.py 此 Django 应用自带的后台管理相关的类
4) movies/app.py 此 Django 应用指定应用名的文件
5) movies/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) movies/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) movies/test.py 此 Django 应用的测试文档
8) movies/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

4.3 在 mysite 应用中导入 movies 应用

在 mysite/mysite/settings.py 中添加以下内容:

......
INSTALLED_APPS = [
......
    'movies',
]
......

步骤五:实现 movies 应用的层级多链接

创建 mysite/movies/urls.py 并添加以下内容:

#coding=utf-8
from django.conf.urls import url, include
from users.views import register

urlpatterns = [
    url(r'^movies/', include('movies.urls')),
]

(补充:这里以设置 /movies/ 链接对应 movies 应用的链接为例)

步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 MairaDB 数据库和客户端

(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client

6.2 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.2.1 进入 MairaDB 数据库

(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p

6.2.2 创建用于 Django 的库

MariaDB [(none)]> create databases movies;

(补充:这里以创建 movies 库为例)

6.2.3 创建用于 Django 的表
6.2.3.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.2.3.2 创建用于 Django 的表

MariaDB [movies]> create table movies(mid INT AUTO_INCREMENT,mname VARCHAR(100) NOT NULL,mdesc TEXT,mimg VARCHAR(120) NOT NULL,mlink VARCHAR(200) NOT NULL,PRIMARY KEY( mid ),UNIQUE( mname ));
Query OK, 0 rows affected (0.058 sec)


补充:这利以创建
1) mid 是 INT 字段,且自动增加
2) mname 是 VARCHAR 字段,长度为 100,且非空
3) mdesc 是 TEXT 字段,长度为 120,且非空
4) mlink 是 VARCHAR 字段,长度为 200,且非空
5) mid 为主键
6) mname 不能重复
为例

6.2.3.3 查看刚创建的表的表结构

MariaDB [movies]> desc movies; 
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| mid   | int(11)      | NO   | PRI | NULL    | auto_increment |
| mname | varchar(100) | NO   | UNI | NULL    |                |
| mdesc | text         | YES  |     | NULL    |                |
| mimg  | varchar(120) | NO   |     | NULL    |                |
| mlink | varchar(200) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
5 rows in set (0.001 sec)

(补充:这里以查看 movies 表的表结构为例)

6.2.4 创建用于 Django 的数据
6.2.4.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.2.4.2 创建用于 Django 的数据

MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Titanic","Accidents and love story, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/titanic/image","eternalcenter.com/titanic");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("World War","Science fiction, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/world-war/image","eternalcenter.com/world-war");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Maleficent","Magic, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/maleficent/image","eternalcenter.com/maleficent");
Query OK, 1 row affected (0.012 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Cars","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/cars/image","eternalcenter.com/cars");
Query OK, 1 row affected (0.011 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("News","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/news/image","eternalcenter.com/news");
Query OK, 1 row affected (0.011 sec)

(补充:这里以符合 movies 表结构的规范,随意向 movies 插入 5 条数据为例)

6.2.4.3 查看刚刚创建的数据

MariaDB [movies]> select * from movies;
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
| mid | mname      | mdesc                                                   | mimg                               | mlink                        |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
|   1 | Titanic    | Accidents and love story, UHD, Dolby Vision,Dolby Atmos | eternalcenter.com/titanic/image    | eternalcenter.com/titanic    |
|   3 | World War  | Science fiction, UHD, Dolby Vision,Dolby Atmos          | eternalcenter.com/world-war/image  | eternalcenter.com/world-war  |
|   4 | Maleficent | Magic, UHD, Dolby Vision,Dolby Atmos                    | eternalcenter.com/maleficent/image | eternalcenter.com/maleficent |
|   5 | Cars       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/cars/image       | eternalcenter.com/cars       |
|   6 | News       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/news/image       | eternalcenter.com/news       |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
5 rows in set (0.000 sec)

(补充:这里以查看 movies 表里的所有数据为例)

6.2.5 创建用于 Django 的用户
6.2.5.1 创建用于 Django 到用户

MariaDB [(movies)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

(补充:这里以创建 root 用户,密码是 password 为例)

6.2.5.2 刷新权限

MariaDB [(movies)]> flush privileges;

6.3 退出 MariaDB 数据库

MariaDB [(none)]> exit

6.4 重启 MariaDB 数据库

(django_env) [root@python mysite]# systemctl restart mariadb

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块

(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql

7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块

在 mysite/mysite/__init__.py 中添加以下内容:

......
import pymysql
pymysql.install_as_MySQLdb()

7.3 在 mysite 应用中设置连接到 MariaDB 数据库

将 mysite/mysite/settings.py 中的以下内容:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
......

修改为:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'movies',
        'HOST': '127.0.0.1’,
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}
......


补充:这里以
1) 使用的库是 movies
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例

步骤八:根据数据库表结构生成 Django 数据库模型

(django_env) [root@python mysite]# python3 manage.py inspectdb>movies/models.py

步骤九:实现分页展示功能
9.1 在 movies 应用中添加一个分页展示功能的 HTML 模板

创建 mysite/movies/templates/movies/index.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        <!--avoid collapse after floating-->
        .clearfix{
                zoom:1;
        }
        .clearfix:after{
                content: "";display: block;visibility: hidden;line-height: 0;clear: both;
        }

        body,div{
            margin:0 auto;
        }

        div{
            border:1px solid gray;
            width:750px;
            text-align: center;
        }

        ul{
            list-style-type: none;
            display: inline-block;
        }


        #header li{
            float: left;
            margin-left:10px;
            font-size:16px;
            font-family: 'Microsoft elegant black';
            color: #666666;

        }
        #header li:hover{
            cursor: pointer;
            background:blue;
            color: white;
        }

        #content li{
            float: left;
            display: inline;
            margin-right:15px;
            text-align: center;
            height:225px;
            overflow: hidden;
            padding-top:10px;
            padding-bottom:5px;

        }
        #content h1{
            font-size:14px;
            margin:0;

        }

        .tip{
            display: block;
            font-size:12px;
        }

       .h1,.tip{
            width:110px;
           text-align: center;
        }
        
        #content ul{
            /*remove the inner and outer margins of UL*/
            margin:0;
            padding:0;

        }
    </style>

</head>
<body>
    <div id="header"  class="clearfix">
        <ul class="clearfix">
            <li>home page</li>
            <li>record</li>
            <li>love</li>
            <li>ethic</li>
            <li>comic</li>
            <li>science fiction</li>
            <li>history</li>
            <li>warfare</li>
            <li>short film</li>
            <li>natural</li>
        </ul>
    </div>
    <div id="content" >
        <ul class="clearfix">
            {% for movie in nowpage %}
                <li>
                    <a href="{{ movie.mlink }}"><img src="{{ movie.mimg }}"/></a>
                    <h1 class="h1">{{ movie.mname }}</h1>
                    <span class="tip">{{ movie.mdesc }}</span>
                </li>
            {% endfor %}
        </ul>
    </div>
    <div>
        {% if nowpage.has_previous %}
            <a href="/movies/?page={{ nowpage.previous_page_number }}">prepage</a>
        {% endif %}
        <!--show previous page when current page exists-->
        {% if nowpage.has_next %}
            <a href="/movies/?page={{ nowpage.next_page_number }}">nextpage</a>
        {% endif %}
        <!--display the next page when it exists-->
    </div>
</body>
</html>


补充:这里主要以
1) 生成一个展示每条数据的 mlink 字段、mimg 字段、mname 字段 和 mdesc 字段的表格,且每条数据就是一个表格
2) 在当前页的前提下,如果有前 1 页或后 2 页,则显示出来并为其设置对应的链接
为例

9.2 在 movies 应用中添加一个网页返回值的模块并实现所需功能

在 mysite/movies/views.py 中添加以下内容:

......
from .models import Movies
from django.core.paginator import Paginator,PageNotAnInteger,EmptyPage
......
def movies(request):

    page = request.GET.get('page',1)
    # receive the request parameter page, and when the page value does not exist, its value is 1

    page = int(page)
    # force num to integer

    movies = Movies.objects.all()
    # import all the data in the database corresponding to the Movies module into the movies variable

    items = Paginator(movies,3)
    # creating a pager object
 
    try:
        nowpage = items.page(page)
        # get the data of the current page
    except PageNotAnInteger:
        nowpage = items.page(1)
        # when page is not a numeric value, the data of the first page is returned
    except EmptyPage:
        nowpage = items.page(items.num_pages)
        # when the number of pages corresponding to the value of page does not exist, the data of the last page is returned

    return render(request,'movies/index.html',{'items':items,'nowpage':nowpage})


补充:这里主要以:
1) 设置 movies 模块并返回 movies/index.html
2) 从 movies/index.html 中获取 page 值,且当 page 值不存在时,其默认值为 1,并将其强行转换成整数
3) 这里的 movies = Movies.objects.all() 是指将 Movies 模块对应数据库里的所有数据导入给 movies 变量
4) 调用 Paginator 模块将 movies 变量生成每页为 3 条数据的分页的 items 对象,并将当前页数据赋予给 nowpage 变量
5) 调用 PageNotAnInteger 模块当页码不是一个数值时返回页码是 1 的数据
6) 调用 EmptyPage 模块当页码不存在时返回最后一页的数据
7) 给予 movies/index.html items 和 nowpage 变量,同时将对应的值赋予给它们
为例

9.3 在 movies 应用中添加一个链接并设置对应的模块

创建 mysite/movies/urls.py 并添加以下内容:

#coding=utf-8
from django.conf.urls import url
from movies.views import movies

urlpatterns = [
    url(r'^$', movies),
]

(补充:这里以设置空链接链接对应 movies 模块为例)

步骤十:启动 Django 服务

(django_env) [root@python mysite]# python3 manage.py runserver

步骤十一:测试分页展示功能

1) 打开浏览器输入以下网址:

http://127.0.0.1:8000/movies/

2) 可以看到对应的展示模版有 3 条数据并且可以向下和向上翻页

[实验] Django 分页展示功能的实现 (原生版)

注意:

文中的 python 系统名、mysite 项目和 movies 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤目录:

步骤一:系统环境要求

步骤二:安装 Django
2.1 安装 Python3
2.2 创建并进入 Django 项目的目录
2.3 将 Django 项目的目录指定为 Django 环境
2.4 进入 Django 环境

步骤三:创建 mysite 项目
3.1 创建 mysite 项目
3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件
3.2.2 显示 mysite 项目的目录
3.3.3 Django 项目目录介绍

步骤四:创建 movies 应用
4.1 创建 movies 应用
4.2 movies 应用的目录
4.2.1 显示 movies 应用的目录
4.2.2 Django 应用目录介绍
4.3 在 mysite 应用中导入 movies 应用

步骤五:实现 movies 应用的层级多链接

步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 MairaDB 数据库和客户端
6.2 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.2.1 进入 MairaDB 数据库
6.2.2 创建用于 Django 的库
6.2.3 创建用于 Django 的表
6.2.3.1 进入用于 Django 到库
6.2.3.2 创建用于 Django 的表
6.2.3.3 查看刚创建的表的表结构
6.2.4 创建用于 Django 的数据
6.2.4.1 进入用于 Django 到库
6.2.4.2 创建用于 Django 的数据
6.2.4.3 查看刚刚创建的数据
6.2.5 创建用于 Django 的用户
6.2.5.1 创建用于 Django 到用户
6.2.5.2 刷新权限
6.3 退出 MariaDB 数据库
6.4 重启 MariaDB 数据库

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块
7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块
7.3 在 mysite 应用中设置连接到 MariaDB 数据库

步骤八:根据数据库表结构生成 Django 数据库模型

步骤九:实现分页展示功能
9.1 在 movies 应用中添加一个分页展示功能的 HTML 模板
9.2 在 movies 应用中添加一个网页返回值的模块并从数据库里分页读取数据
9.3 在 movies 应用中添加一个链接并设置对应的模块

步骤十:启动 Django 服务

步骤十一:测试展示分页功能

具体的操作步骤:
步骤一:系统环境要求

1) 服务器的系统需要是 openSUSE 15.2 版本
2) 服务器要关闭防火墙
3) 服务器系统要配置好可用的软件源(最好是软件数量最多的官方版本)
4) 服务器要能够连接外网

步骤二:安装 Django
2.1 安装 Python3

[root@python ~]# zypper -n install python3

(补充:在此次操作发生时,最新的 python 版本是 3.6.12)

2.2 创建并进入 Django 项目的目录

[root@python ~]# mkdir project
[root@python ~]# cd project

2.3 将 Django 项目的目录指定为 Django 环境

[root@python project]# python3 -m venv django_env

2.4 进入 Django 环境

[root@python project]# source django_env/bin/activate
(django_env) [root@python project]# pip install django

(补充:在此次操作发生时,最新的 Django 版本是 3.2)

步骤三:创建 mysite 项目
3.1 创建 mysite 项目

(django_env) [root@python project]# django-admin startproject mysite

3.2 mysite 项目的目录
3.2.1 安装 tree 目录显示软件

(django_env) [root@python project]# zypper -n install tree

3.2.2 显示 mysite 项目的目录

(django_env) [root@python project]# cd mysite
(django_env) [root@python mysite]# tree
.
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

1 directory, 5 files

3.3.3 Django 项目目录介绍

1) mysite 此 Django 项目的容器
2) manage.py 命令行工具,与 Django 项目进行交互
3) mysite/__init__.py 空文件,通知 Python 此项目是一个 Python 包
4) mysite/settings.py 此 Django 项目的配置文件
5) mysite/urls.py 此 Django 项目的 URL 声明和 Django 的网站“目录”
6) mysite/wsgi.py WSGI 兼容 Web 服务器的入口

步骤四:创建 movies 应用
4.1 创建 movies 应用

(django_env) [root@python mysite]# django-admin startapp movies

4.2 movies 应用的目录
4.2.1 显示 movies 应用的目录

(django_env) [root@python mysite]# tree
.
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── movies
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

3 directories, 13 files

4.2.2 Django 应用目录介绍

1) movies/app.py 此 Django 应用的容器
2) movies/__init__.py 空文件,通知 python 此项目是一个 python 包
3) movies/admin.py 此 Django 应用自带的后台管理相关的类
4) movies/app.py 此 Django 应用指定应用名的文件
5) movies/migrations.py 此 Django 应用通过 python 代码生成数据库表时里面会产生一些迁移文件
6) movies/models.py 可以在里面创建一些 Python 对象并通过这些对象在数据库里创建对应的表
7) movies/test.py 此 Django 应用的测试文档
8) movies/views.py 此 Django 应用的视图,接收前端数据,把数据传递给后端,响应相关页面

4.3 在 mysite 应用中导入 movies 应用

在 mysite/mysite/settings.py 中添加以下内容:

INSTALLED_APPS = [
    'movies',
]

步骤五:实现 movies 应用的层级多链接

创建 mysite/movies/urls.py 并添加以下内容:

......
#coding=utf-8
from django.conf.urls import url, include
from users.views import register

urlpatterns = [
......
    url(r'^movies/', include('movies.urls')),
]

(补充:这里以设置 /movies/ 链接对应 movies 应用的链接为例)

步骤六:搭建用于 Django 的 MariaDB 数据库环境
6.1 安装 MairaDB 数据库和客户端

(django_env) [root@python mysite]# zypper -n install mariadb mariadb-devel mariadb-server mariadb-client

6.2 创建用于 Django 的 MairaDB 的库、表、数据和用户并插入测试数据
6.2.1 进入 MairaDB 数据库

(django_env) [root@python mysite]# mysql -h 127.0.0.1 -p

6.2.2 创建用于 Django 的库

MariaDB [(none)]> create databases movies;

(补充:这里以创建 movies 库为例)

6.2.3 创建用于 Django 的表
6.2.3.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.2.3.2 创建用于 Django 的表

MariaDB [movies]> create table movies(mid INT AUTO_INCREMENT,mname VARCHAR(100) NOT NULL,mdesc TEXT,mimg VARCHAR(120) NOT NULL,mlink VARCHAR(200) NOT NULL,PRIMARY KEY( mid ),UNIQUE( mname ));
Query OK, 0 rows affected (0.058 sec)


补充:这利以创建
1) mid 是 INT 字段,且自动增加
2) mname 是 VARCHAR 字段,长度为 100,且非空
3) mdesc 是 TEXT 字段,长度为 120,且非空
4) mlink 是 VARCHAR 字段,长度为 200,且非空
5) mid 为主键
6) mname 不能重复
为例

6.2.3.3 查看刚创建的表的表结构

MariaDB [movies]> desc movies; 
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| mid   | int(11)      | NO   | PRI | NULL    | auto_increment |
| mname | varchar(100) | NO   | UNI | NULL    |                |
| mdesc | text         | YES  |     | NULL    |                |
| mimg  | varchar(120) | NO   |     | NULL    |                |
| mlink | varchar(200) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
5 rows in set (0.001 sec)

(补充:这里以查看 movies 表的表结构为例)

6.2.4 创建用于 Django 的数据
6.2.4.1 进入用于 Django 到库

MariaDB [(none)]> use movies;

(补充:这里以进入 moives 库为例)

6.2.4.2 创建用于 Django 的数据

MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Titanic","Accidents and love story, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/titanic/image","eternalcenter.com/titanic");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("World War","Science fiction, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/world-war/image","eternalcenter.com/world-war");
Query OK, 1 row affected (0.008 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Maleficent","Magic, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/maleficent/image","eternalcenter.com/maleficent");
Query OK, 1 row affected (0.012 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("Cars","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/cars/image","eternalcenter.com/cars");
Query OK, 1 row affected (0.011 sec)
MariaDB [movies]> 
MariaDB [movies]> insert into movies (mname,mdesc,mimg,mlink) VALUES("News","Animation, UHD, Dolby Vision,Dolby Atmos","eternalcenter.com/news/image","eternalcenter.com/news");
Query OK, 1 row affected (0.011 sec)

(补充:这里以符合 movies 表结构的规范,随意向 movies 插入 5 条数据为例)

6.2.4.3 查看刚刚创建的数据

MariaDB [movies]> select * from movies;
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
| mid | mname      | mdesc                                                   | mimg                               | mlink                        |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
|   1 | Titanic    | Accidents and love story, UHD, Dolby Vision,Dolby Atmos | eternalcenter.com/titanic/image    | eternalcenter.com/titanic    |
|   3 | World War  | Science fiction, UHD, Dolby Vision,Dolby Atmos          | eternalcenter.com/world-war/image  | eternalcenter.com/world-war  |
|   4 | Maleficent | Magic, UHD, Dolby Vision,Dolby Atmos                    | eternalcenter.com/maleficent/image | eternalcenter.com/maleficent |
|   5 | Cars       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/cars/image       | eternalcenter.com/cars       |
|   6 | News       | Animation, UHD, Dolby Vision,Dolby Atmos                | eternalcenter.com/news/image       | eternalcenter.com/news       |
+-----+------------+---------------------------------------------------------+------------------------------------+------------------------------+
5 rows in set (0.000 sec)

(补充:这里以查看 movies 表里的所有数据为例)

6.2.5 创建用于 Django 的用户
6.2.5.1 创建用于 Django 到用户

MariaDB [(movies)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

(补充:这里以创建 root 用户,密码是 password 为例)

6.2.5.2 刷新权限

MariaDB [(movies)]> flush privileges;

6.3 退出 MariaDB 数据库

MariaDB [(none)]> exit

6.4 重启 MariaDB 数据库

(django_env) [root@python mysite]# systemctl restart mariadb

步骤七:实现连接 MariaDB 数据库
7.1 安装 Django 连接 MariaDB 的模块

(django_env) [root@python mysite]# pip3 install hexdump
(django_env) [root@python mysite]# pip3 install pymysql

7.2 在 mysite 应用中添加 Django 连接 MariaDB 的模块

在 mysite/mysite/__init__.py 中添加以下内容:

import pymysql
pymysql.install_as_MySQLdb()

7.3 在 mysite 应用中设置连接到 MariaDB 数据库

将 mysite/mysite/settings.py 中的以下内容:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}
......

修改为:

......
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'movies',
        'HOST': '127.0.0.1’,
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}
......


补充:这里以
1) 使用的库是 movies
2) 使用的服务器是 127.0.0.1
3) 使用的端口是 3306
4) 使用的用户是 root
5) 使用的密码是 password
为例

步骤八:根据数据库表结构生成 Django 数据库模型

(django_env) [root@python mysite]# python3 manage.py inspectdb>movies/models.py

步骤九:实现分页展示功能
9.1 在 movies 应用中添加一个分页展示功能的 HTML 模板

创建 mysite/movies/templates/movies/index.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
         /*avoid collapse after floating*/
        .clearfix{
                zoom:1;
        }
        .clearfix:after{
                content: "";display: block;visibility: hidden;line-height: 0;clear: both;
        }

        body,div{
            margin:0 auto;
        }

        div{
            border:1px solid gray;
            width:750px;
            text-align: center;
        }

        ul{
            list-style-type: none;
            display: inline-block;
        }


        #header li{
            float: left;
            margin-left:10px;
            font-size:16px;
            font-family: 'Microsoft elegant black';
            color: #666666;

        }
        #header li:hover{
            cursor: pointer;
            background:blue;
            color: white;
        }

        #content li{
            float: left;
            display: inline;
            margin-right:15px;
            text-align: center;
            height:225px;
            overflow: hidden;
            padding-top:10px;
            padding-bottom:5px;

        }
        #content h1{
            font-size:14px;
            margin:0;

        }

        .tip{
            display: block;
            font-size:12px;
        }

       .h1,.tip{
            width:110px;
           text-align: center;
        }
        
        #content ul{
            /*remove the inner and outer margins of UL*/
            margin:0;
            padding:0;

        }
    </style>

</head>
<body>
    <div id="header"  class="clearfix">
        <ul class="clearfix">
            <li>home page</li>
            <li>record</li>
            <li>love</li>
            <li>ethic</li>
            <li>comic</li>
            <li>science fiction</li>
            <li>history</li>
            <li>warfare</li>
            <li>short film</li>
            <li>natural</li>
        </ul>
    </div>
    <div id="content" >
        <ul class="clearfix">
            {% for movie in movies %}
                <li>
                    <a href="{{ movie.mlink }}"><img src="{{ movie.mimg }}"/></a>
                    <h1 class="h1">{{ movie.mname }}</h1>
                    <span class="tip">{{ movie.mdesc }}</span>
                </li>
            {% endfor %}
        </ul>
    </div>
    <div>
         <a href="/movies/?page={{ prepage }}">prepage</a>
         <a href="/movies/?page={{ nextpage }}">nextpage</a>
    </div>
</body>
</html>

(补充:这里主要以生成一个展示每条数据的 mlink 字段、mimg 字段、mname 字段 和 mdesc 字段的表格,且每条数据就是一个表格,并为前一页和后一页添加一个链接为例)

9.2 在 movies 应用中添加一个网页返回值的模块并从数据库里读取全部数据

在 mysite/movies/views.py 中添加以下内容:

......
from .models import Movies
import math
......
def pageandinfo(pages,size=3):
    # size here refers to the number of display data on each page
    
    pages = int(pages)
    # force num to integer

    totalrecords = Movies.objects.count()
    # get the total number of data from the database

    totalpages = int(math.ceil(totalrecords*1.0/size))
    # the function of the math.cell parameter is to add one to the integer if the number of decimals exceeds the integer part,example:match.ceil (1.1) produces 2.0

    if pages < 1:
       pages = 1
    if pages > totalpages:
       pages = totalpages
   # if num is less than 1, it is equal to 1. If num is greater than totalrecords, it is equal to totalrecords

    movies = Movies.objects.all()[((pages-1)*size):(pages*size)]
   # in all data, every num page displays (num-1)*size data to (num)*size data

    return movies,pages

def movies(request):

    pages = request.GET.get('page',1)
    # receive request parameter pages

    movies,n = pageandinfo(pages)
    # through the pages parameter, the paging request is processed

    prepage = n-1
    # calculate the page number of the previous page

    nextpage = n+1
    # calculate the page number of the next page
    
    return render(request,'movies/index.html',{'movies':movies,'prepage':prepage,'nextpage':nextpage})


补充:这里主要以:
1) 设置 pageandinfo 模块,返回 movies 和 pages 两个变量,其中 movies 变量是 (pages-1)size) 到 (pagessize) 条 Movies 模块里的数据
2) 设置 movies 模块并返回 movies/index.html
从 movies/index.html 中获取 page 值
调用 pageandinfo 模块通过 page 值计算出 movies 值
给予 movies/index.html movies、prepage 和 nextpage 变量,同时提前设置了对应的值并赋予给它们
为例

9.3 在 movies 应用中添加一个链接并设置对应的模块

创建 mysite/movies/urls.py 并添加以下内容:

#coding=utf-8
from django.conf.urls import url
from movies.views import movies

urlpatterns = [
    url(r'^$', movies),
]

(补充:这里以设置空链接链接对应 movies 模块为例)

步骤十:启动 Django 服务

(django_env) [root@python mysite]# python3 manage.py runserver

步骤十一:测试分页展示功能

1) 打开浏览器输入以下网址:

http://127.0.0.1:8000/movies/

2) 可以看到对应的展示模版有 3 条数据并且可以向下和向上翻页