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

注意:

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

正文:

步骤一:系统环境要求

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 此项目是 1 个 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 此项目是 1 个 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 应用中添加 1 个分页展示功能的 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 应用中添加 1 个网页返回值的模块并从数据库里读取全部数据

在 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 应用中添加 1 个链接并设置对应的模块

创建 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 应用只是站主在本次操作中随意取的名称,读者可以根据自己的喜好换成任意别的名称

正文:

步骤一:系统环境要求

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 此项目是 1 个 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 此项目是 1 个 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 应用中添加 1 个链接并链接 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 [(movies)]> 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 应用中添加 1 个展示功能的 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>
</body>
</html>

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

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

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

......
from .models import Movies
......
def movies(request):
    movies = Movies.objects.all()
    return render(request,'movies/index.html',{'movies':movies})


补充:这里以:
1) 设置 movies 模块并返回 movies/index.html 为例
2) 这里的 movies = Movies.objects.all() 是指将 Movies 模块对应数据库里的所有数据导入给 movies 变量
3) 这里的 {‘movies’:movies} 是指给 movies/index.html 一个 movies 变量,并将现在的 movies 值赋予即将给予 movies/index.html 的 movies 变量
为例

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

创建 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) 可以看到对应的展示模版

[内容] pip 工具的安装 (MacBook Air 版)

内容一:安装 pip2

1.1 下载 pip2

$ curl 'https://bootstrap.pypa.io/pip/2.7/get-pip.py' > get-pip.py

1.2 安装 pip2

$ sudo python get-pip.py

1.3 删除 pip2

$ rm get-pip.py

1.4 显示安装的 pip2

1.4.1 显示在 python 里有没有 pip 安装包
$ ls /Library/Python/2.7/site-packages/

(补充:这里以 Python 版本是 2.7 为例)

1.4.2 显示有没有 pip2 命令
$ which pip2
1.4.3 升级 pip2
$ sudo pip2 install --upgrade pip

内容二:安装 pip3

2.1 准备安装 pip3 所需的环境

2.1.1 安装 python3
2.1.1.1 输入 python3 命令
$ python3
2.1.1.2 在弹出的对话框里安装 python3

(步骤略)

2.1.2 安装 xcode
2.1.2.1 输入 xcode-select –install 命令
$ xcode-select --install
2.1.2.2 在弹出的对话框里安装 xcode

(步骤略)

2.2 安装 pip3

2.2.1 下载 pip3
$ curl 'https://bootstrap.pypa.io/pip/get-pip.py' > get-pip.py
2.2.2 安装 pip3
$ sudo python get-pip.py
2.2.3 删除 pip3
$ rm get-pip.py
2.2.4 显示安装的 pip3
2.2.4.1 显示在 python 里有没有 pip 安装包
$ ls /Library/Python/3.8/site-packages/

(补充:这里以 Python 版本是 3.8 为例)

2.2.4.2 显示有没有 pip3 命令
$ which pip3
2.2.4.3 升级 pip3
$ sudo pip3 install --upgrade pip

[实验] Django 登录功能的实现 (MariaDB 版)

注意:

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

正文:

步骤一:系统环境要求

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 此项目是 1 个 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 users

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
└── users
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

3 directories, 13 files
4.2.2 Django 应用目录介绍

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

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

5.1 在 mysite 应用中添加 1 个链接并链接 users 的链接

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

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

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

5.2 在 mysite 应用中导入 users 应用

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

......
INSTALLED_APPS = [
......
    'users',
]
......

步骤六:实现连接 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 database test;

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

6.4.3 创建用于 Django 的用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

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

6.4.4 退出 MariaDB 数据库
MariaDB [(none)]> exit
6.4.5 重启 MariaDB
(django_env) [root@python mysite]# systemctl restart mariadb

6.5 在 users 应用数据库模板中添加 user 类

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

......
class user(models.Model):
    tname = models.CharField(max_length=30,unique=True)
    tpassword = models.CharField(max_length=30)


补充:
1) 这里以创建 tname 和 tpassword 两个字符,长度为 30 个字节,其中 1 个为唯一为例
2) 主键可以不用设置,默认会自动生成 1 个 ID 主键
3) 默认表名会生成 <应用名>_<模型类名>,在这里就是 users_user
4) 指定要生成的表明的设置方法是:

    class Meta:
        db_table = '<table>'

6.6 在 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': 'test',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': 'password',
    }
}
......


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

6.7 生成牵引文件

(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'users':
  users/migrations/0001_initial.py
    - Create model user

(补充:这里以将 users 应用的 model 模块转换成牵引文件为例)

6.8 将牵引文件导入 MariaDB 数据库

(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
  Applying users.0001_initial... OK

6.9 查看导入到 MariaDB 数据库的表

6.9.1 进入 MariaDB 数据库
# mysql -uroot -h172.16.0.7 -p
6.9.2 查看所有的库
> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
6.9.3 进入 test 库
> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
6.9.4 查看 test 库里所有的表
> show tables;
+----------------------------+
| Tables_in_test             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| users_user                 |
+----------------------------+
11 rows in set (0.001 sec)
6.9.5 查看 users_user 表里的数据
> select * from users_user;
Empty set (0.001 sec)
6.9.6 查看 users_user 的表结构
> desc users_user;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| tname     | varchar(30) | NO   | UNI | NULL    |                |
| tpassword | varchar(30) | NO   |     | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
3 rows in set (0.003 sec)
6.9.7 退出 MariaDB 数据库
> quit;

步骤七:实现注册功能

7.1 在 users 应用中添加 1 个注册功能的 HTML 模板

创建 mysite/users/templates/users/register.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>register</title>
</head>
<body>
    <form action="/users/register/" method="post">
        {% csrf_token %}
        <p>
            <label for="un">User: </label><input type="text" name="uname" id="un"/>
        </p>
        <p>
            <label for="up">Password: </label><input type="password" name="upassword" id="up"/>
        </p>
        <input type="submit" value="register"/>
    </form>
</body>
</html>


补充:这里以
1) 生成 1 个用户名输入栏,赋值给 uname
2) 生成 1 个密码输入栏,赋值给 upassword
3) 生成 1 个 register 提交按钮
为例

7.2 在 users 应用中添加 1 个网页返回值的模块并将符合的数值插入数据库

将 mysite/users/views.py 里的内容全部修改如下:

from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import user

# Create your views here.

def register(request):
    if request.method=="GET":
        return render(request,'users/register.html')
    else:
        uname = request.POST.get('uname','')
        upassword = request.POST.get('upassword','')

        if uname.strip()!='' and upassword.strip()!='':
        # determine whether uname and upassword are null values
            nuser = user(tname=uname,tpassword=upassword)

            nuser.save()
            return HttpResponse('success!')
        else:
            return HttpResponse('fail')

    return HttpResponse('fail')


补充:这里以
1) 设置 register 模块并返回 users/register.html
2) 设置 register 模块当网页返回模式是 POST 且 uname 和 upassword 都为非空时将数据存入数据库
为例

7.3 在 users 应用中添加 1 个链接并设置对应的模块

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

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

urlpatterns = [
    url(r'^register', register),
]

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

步骤八:实现展示功能

8.1 在 users 应用中添加 1 个展示数据功能的 HTML 模板

创建 mysite/users/templates/users/show.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>show</title>
</head>
<body>
    <table border="1" cellspacing="0" width="500px">
        <tr>
            <th>Num</th>
            <th>ID</th>
            <th>Name</th>
            <th>Password</th>
        </tr>
        {% for oneuser in userlist %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ oneuser.id }}</td>
                <td>{{ oneuser.tname }}</td>
                <td>{{ oneuser.tpassword }}</td>
            </tr>
        {% endfor %}
    </table>    
</body>
</html>


补充:
1) 这里以生成 1 个表格,并将数据循环写入进去为例
2) 这里的 {% for oneuser in userlist %}……{% endfor %} 是指以 userlist 变量里的数据进行循环
3) 这里的 forloop.counter 变量在这里的作用是正向计数,也可以使用revcounter0 进行逆向计数

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

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

......
def show(request):
    ruser = user.objects.all()

    return render(request,'users/show.html',{'userlist':ruser})


补充:这里以
1) 设置 ruser 模块并返回 users/show.html
2) 这里的 ruser = user.objects.all() 是指将 user 模块对应数据库里的所有数据导入给 ruser 变量
3) 这里的 {‘userlist’:ruser} 是指给 users/show.html 一个 user list 变量,并将现在的 ruser 值赋予即将给予 users/show.html 的 ruser 变量
为例

8.3 在 users 应用中添加 1 个链接并设置对应的模块

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

......
from users.views import show

urlpatterns = [
......
    url(r'^show', show),
]

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

步骤九:实现登录功能

9.1 在 users 应用中添加 1 个登录功能的 html 模板

创建 mysite/users/templates/users/login.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>register</title>
</head>
<body>
    <form action="/users/login/" method="post">
        {% csrf_token %}
        <p>
            <label for="un">User: </label><input type="text" name="uname" id="un"/>
        </p>
        <p>
            <label for="up">Password: </label><input type="password" name="upassword" id="up"/>
        </p>
        <input type="submit" value="login"/>
    </form>
</body>
</html>


补充:这里以
1) 生成 1 个用户名输入栏,赋值给 uname
2) 生成 1 个密码输入栏,赋值给 upassword
3) 生成 1 个 login 提交按钮
为例

9.2 在 users 应用中添加 1 个网页返回值的模块并从数据库里比对数据

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

......
def login(request):
    if request.method=='GET':
        return render(request,'users/login.html')
    else:
        loginname = request.POST.get('uname')
        loginpassword = request.POST.get('upassword')

        if loginname and loginpassword:
            c = user.objects.filter(tname=loginname,tpassword=loginpassword).count()
            if c == 1:
                return HttpResponse('Login Success !')
    return HttpResponse('Login Fail !')


补充:这里以
1) 设置 login 模块并返回 users/login.html
2) 从 users/register.html 中获取 uname 和 upassword 值
3) 设置 login 模块当网页返回模式是 POST 且 uname 和 upassword 与数据库中对应的值一样时则返回 ‘Login Success !’ 值,否则返回 ‘Login Fail !’ 值
为例
4) 这里 c = user.objects.filter(tname=loginname,tpassword=loginpassword).count() 中逗号 “,” 是 and 的意思

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

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

......
from users.views import login

urlpatterns = [
......
    url(r'^login/$', login),
]

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

步骤十:启动 Django 服务

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

步骤十一:测试注册功能

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

http://127.0.0.1:8000/users/register/

2) 当用户名输入 eternalcenter,密码输入密码 1 点击 “register” 时,返回 successful

步骤十二:测试展示功能

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

http://127.0.0.1:8000/users/show/

2) 可以看到以下信息:

1 eternalcenter 1

步骤十三:测试登录功能

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

http://127.0.0.1:8000/users/login/

2) 当用户名输入 eternalcenter,密码输入密码 1 点击 “login” 时,返回 Login Success !

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

注意:

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

正文:

步骤一:系统环境要求

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 此项目是 1 个 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 users

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
└── users
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

3 directories, 13 files
4.2.2 Django 应用目录介绍

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

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

5.1 在 mysite 应用中添加 1 个链接并链接 users 应用的链接

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

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

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

5.2 在 mysite 应用中导入 users 应用

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

......
INSTALLED_APPS = [
......
    'users',
]
......

步骤六:实现连接 SQLite 数据库

6.1 在 users 应用数据库模板中添加 user 类

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

......
class user(models.Model):
    tname = models.CharField(max_length=30,unique=True)
    tpassword = models.CharField(max_length=30)


补充:
1) 这里以创建 tname 和 tpassword 两个字符,长度为 30 个字节,其中一个为唯一为例
2) 主键可以不用设置,默认会自动生成一个 ID 主键
3) 默认表名会生成 <应用名>_<模型类名>,在这里就是 users_user
4) 指定要生成的表明的设置方法是:

    class Meta:
        db_table = '<表名>'

6.2 将 Django 的模板导入 SQLite 数据库

6.2.1 生成牵引文件
(django_env) [root@python mysite]# python3 manage.py makemigrations
Migrations for 'users':
  users/migrations/0001_initial.py
    - Create model user

(补充:这里以将 users 应用的 model 模块转换成牵引文件为例)

6.2.2 将牵引文件导入 SQLite 数据库
(django_env) [root@python mysite]# python3 manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying admin.0003_logentry_add_action_flag_choices... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
  Applying users.0001_initial... OK

步骤七:实现注册功能

7.1 在 users 应用中添加 1 个注册功能的 HTML 模板

创建 mysite/users/templates/users/register.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>register</title>
</head>
<body>
    <form action="/users/register/" method="post">
        {% csrf_token %}
        <p>
            <label for="un">User: </label><input type="text" name="uname" id="un"/>
        </p>
        <p>
            <label for="up">Password: </label><input type="password" name="upassword" id="up"/>
        </p>
        <input type="submit" value="register"/>
    </form>
</body>
</html>


补充:这里以
1) 生成一个用户名输入栏,赋值给 uname
2) 生成一个密码输入栏,赋值给 upassword
3) 生成一个 register 提交按钮
为例

7.2 在 users 应用中添加 1 个网页返回值的模块并将符合的数值插入数据库

将 mysite/users/views.py 里的内容全部修改如下:

from django.shortcuts import render
from django.shortcuts import HttpResponse
from .models import user

# Create your views here.

def register(request):
    if request.method=="GET":
        return render(request,'users/register.html')
    else:
        uname = request.POST.get('uname','')
        upassword = request.POST.get('upassword','')

        if uname.strip()!='' and upassword.strip()!='':
        # confirm whether uname and upassword are null
            nuser = user(tname=uname,tpassword=upassword)

            nuser.save()
            return HttpResponse('success!')
        else:
            return HttpResponse('fail')

    return HttpResponse('fail')


补充:这里以
1) 设置 register 模块并返回 users/register.html
2) 从 users/register.html 中获取 uname 和 upassword 值
3) 设置 register 模块当网页返回模式是 POST 且 uname 和 upassword 都为非空时将数据存入数据库
为例

7.3 在 users 应用中添加 1 个链接并设置对应的模块

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

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

urlpatterns = [
    url(r'^register', register),
]

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

步骤八:实现展示功能

8.1 在 users 应用中添加 1 个展示数据功能的 HTML 模板

创建 mysite/users/templates/users/show.html 并添加以下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>show</title>
</head>
<body>
    <table border="1" cellspacing="0" width="500px">
        <tr>
            <th>Num</th>
            <th>ID</th>
            <th>Name</th>
            <th>Password</th>
        </tr>
        {% for oneuser in userlist %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ oneuser.id }}</td>
                <td>{{ oneuser.tname }}</td>
                <td>{{ oneuser.tpassword }}</td>
            </tr>
        {% endfor %}
    </table>    
</body>
</html>


补充:
1) 这里以生成 1 个表格,并将数据循环写入进去为例
2) 这里的 {% for oneuser in userlist %}……{% endfor %} 是指以 userlist 变量里的数据进行循环
3) 这里的 forloop.counter 变量在这里的作用是正向计数,也可以使用revcounter0 进行逆向计数

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

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

......
def show(request):
    ruser = user.objects.all()

    return render(request,'users/show.html',{'userlist':ruser})


补充:这里以
1) 设置 show 模块并返回 users/show.html
2) 这里的 ruser = user.objects.all() 是指在将所有数据导入给 ruser 变量
3) 这里的 {‘userlist’:ruser} 是指给 users/show.html 一个 userlist 变量,并将现在的 ruser 值赋予即将给予 users/show.html 的 userlist 变量
为例

8.3 在 users 应用中添加 1 个链接并设置对应的模块

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

......
from users.views import show

urlpatterns = [
......
    url(r'^show', show),
]

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

步骤九:启动 Django 服务

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

步骤十:测试注册功能

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

http://127.0.0.1:8000/users/register/

2) 当用户名输入 eternalcenter,密码输入密码 1 点击 “register” 时,返回 successful

步骤十一:测试展示功能

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

http://127.0.0.1:8000/users/show/

2) 可以看到以下信息:

1 eternalcenter 1