Django 【全家桶】

Python Web 框架要点

1、Web 应用程序处理流程:

在这里插入图片描述

2、Web程序框架的意义

  • 用来搭建Web应用程序
  • 免去不同Web应用相同代码部分的重复编写,只需要关心Web应用核心的业务逻辑实现

3、Web应用程序的本质

  • 接收并解析HTTP请求,获取具体的请求信息
  • 处理本次HTTP请求,即完成本次请求的业务逻辑处理
  • 构造并返回处理结果 —— HTTP响应

4、Web框架学习方法

如何搭建工程程序

  • 工程的组建
  • 工程的配置
  • 路由定义
  • 视图函数定义

如何获取请求数据(操作 request 对象)
如何构造响应数据(构造 response 对象)
如何使用中间层
框架提供的其它功能组建的使用

  • 数据库
  • 模板
  • admin

5、Django框架特点:

重量级框架

对比 Flask 框架,Django原生提供了众多的功能组件,让开发更简便快捷

  • 提供项目工程管理的自动化脚本工具
  • 数据库ORM支持(对象关系映射,英语:Object Relational Mapping)
  • 模板
  • 表单
  • Admin管理站点
  • 文件管理
  • session 机制
  • 缓存

MVT模式

在这里插入图片描述

  • M ( Model),主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作
  • V (View),用于封装结果,生成页面展示的 HTML 内容
  • C(Controller),用于接收请求,处理业务逻辑,与 Model 和 View 交互,返回结果

Django的MVT

在这里插入图片描述

  • M (Model),与 MVC 中的M功能相同,负责和数据库交互,进行数据处理
  • V (View),与 MVC 中的C功能相同,接收请求,进行业务处理,返回应答
  • T (Template),与 MVC 中的V功能相同,负责封装构造要返回的 html

注:差异就在于黑线黑箭头标识出来的部分

最开始创建Django工程可以在项目文件夹目录中运行命令:

> django-admin startproject [ 项目名 ]
> django-admin startapp [ 应用名 ]

快速导包:ALT + [ 回车 ]

一、Django建站基础

1. Django项目创建

step1. 创建工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
manage.py : 命令行工具,允许以多种方式与项目进行交互。在CMD窗口下,将路径切换到django项目下输入

 python manage.py help 可以查看工具的具体功能 

init.py : 初始化文件,通常无需修改
setting.py : 项目配置文件
url.py : 项目的URL设置,网站地址信息
wsgi.py : [WebServerGatewayInterface] 服务器网关接口,Python应用与Web服务器间的接口

step2. 创建APP

项目创建完成后,创建 项目应用,简称 App,是网站的功能
每个App是网站的一页或者多页 , App的创建由 manage.py 实现
● cd MyDjango , 切换目录
● 使用 manage.py 创建 app index 和 user

python manage.py startapp index

python manage.py startapp user

在这里插入图片描述
index 文件夹下的文件:
在这里插入图片描述

migrations : 用于数据库的迁移
init.py : 初始化文件
admin.py : 当前App的后台管理系统
app.py : 当前App的配置信息,通常无需修改
model.py : 定义在映射类关联数据库,MTV中的Model
tests.py : 自动化测试后模块
views.py : 逻辑处理模块,MTV中的Views
在这里插入图片描述

step3. 项目运行

在这里插入图片描述

二、Django配置信息

1. MySQL 5.7.2下载步骤如下:

MySQL下载与安装,请参考:
https://blog.csdn.net/weixin_42869365/article/details/83472466

(1) 下载完成后,运行安装包,出现如图所示的页面。此页面要求选择安装选项,接受默认的安装选项即可。
在这里插入图片描述

(2)MySQL安装程序会检测软件环境是否满足安装需求,如果出现如图所示的页面,则需要先安装缺失的软件。如图所示的缺失软件比较多,可以有选择性地安装所需软件。

例如,MySQL Server5.7.22 是必须要安装的软件,但缺失Microsoft Visual C++ 2013 Redistributable依赖软件,只需要下载安装该软件即可,其它软件可以忽略。
在这里插入图片描述
(3)下图所示为即将开始安装的软件列表,确保列表中要有 MySQL Server 5.7.22,确认后,单击 “ Execute ” 按钮,继续执行下一步。
在这里插入图片描述
(4)安装完成后,出现如图所示的页面,该页面表示 MySQL5.7.22 安装已完成,单击 “ Next ” 按钮,进入配置页面。
在这里插入图片描述

2. MySQL 5.7.2 配置步骤如下:

(1)出现图所示的页面,说明进入了 MySQL系统的配置页面,单击 “ Next ” 按钮,继续执行下一步。
在这里插入图片描述
(2)出现图所示的页面,要求选择数据库引擎,选择默认引擎即可。单击 “ Next ” 按钮,继续执行下一步。
在这里插入图片描述
(3)出现图所示的页面,要求 配置数据库网络,网络采用默认的 TCP / IP,端口号采用默认的 3306 即可。单击 “ Next ” 按钮,继续执行下一步。
在这里插入图片描述
(4)出现下图所示的页面,要求配置数据库用户和密码,单击 “ Add User ” 按钮,弹出图所示对话框,输入访问数据库的用户和密码。单击 “ Next ” 按钮,继续执行下一步。

在这里插入图片描述
(5)出现下图所示的页面,该页面将 MySQL服务配置为Windows服务,可以在Windows启动时,自动启动服务,采用默认选项即可。单击“Next”按钮,继续执行下一步。
在这里插入图片描述

(6)出现下图所示的页面,该页面配置MySQL提供远程服务,勾选检查框,确保 Windows防火墙 打开33060 端口。单击 “ Next ” 按钮,继续执行下一步。
在这里插入图片描述
(7)出现下图所示的页面,该页面应用配置项,单击 “ Execute ” 按钮 应用配置项。
在这里插入图片描述
(8)出现下图所示的页面,说明应用配置项成功,并启动了MySQL Service。
在这里插入图片描述

3. 测试MySQL服务是否启动步骤如下:

(1) 运行MySQL安装包,出现如图所示的页面,选择 “Samples and Examples” 项,单击 “Reconfigure” 按钮。
在这里插入图片描述
(2)出现图所示的页面,输入 root用户的密码,在安装时输入的密码,单击“Check”按钮
在这里插入图片描述
(3)出现如图所示页面,表示MySQL服务连接成功。
在这里插入图片描述
Navicat安装及操作:
在这里插入图片描述
Navicat安装:
https://www.cnblogs.com/zenglintao/p/12823285.html
在这里插入图片描述新建数据库(名称:mydjango)
在这里插入图片描述
在这里插入图片描述
1. 使用 PyCharm 的 Terminal,使用 manage.py 生成两个app(index, user)

   python manage.py startapp user

   python manage.py startapp index 

配置信息主要由项目中 settings.py 文件 实现,主要配置有:

  • 项目路径
  • 密钥配置
  • 域名访问权限
  • App列表
  • 配置静态资源
  • 配置模板文件
  • 数据库配置
  • 中间件
  • 缓存配置

4. 基本配置信息

一个简单的项目必备的基本配置信息有:
项目路径、秘钥配置、域名访问权限、App列表和中间件
以 MyDjango项目 为例,settings.py 的基本配置如下
在这里插入图片描述
上述代码列出了 项目路径BASE_DIR密钥配置SECRET_KEY调试模式 DEBUG访问权限 ALLOWED_HOSTSApp列表 INSTALLED_APPS,各个配置说明如下:

  • 项目路径 BASE_DIR:主要通过os模块读取当前项目在系统的具体路径,代码在创建项目时自动生成,通常无需修改。

  • 密钥配置 SECURIT_KEY:是一个随机值,在项目创建的时候自动生成,通常无需修改。主要用于重要数据的加密处理,提高系统安全性。

  • 调试模式 DEBUG:该值为布尔类型。开发局阶段True,项目部署上线改为False。

  • 域名访问权限 ALLOWED_HOSTS:设置可访问的域名,默认为空。DEBUG=True 同时 ALLOWD_HOSTS为空代表项目只允许以localhost或者127.0.0.1在浏览器上访问。DEBUG=False时ALLOWD_HOSTS为必填项,设置为ALLOWD_HOSTS=[‘xxx.xxx.xxx.xxx’]

  • App列表 INSTALLED_APPS: 告诉django有哪些App,项目中已有配置信息如下:

    1. admin 内置的后台管理系统
    2. auth 内置的用户认证系统
    3. contenttypes 记录项目中的 model 元数据
    4. sessions Session会话功能,用于标识访问网站的用户身份信息
    5. messages 消息提示功能
    6. staticfiles 查找静态资源路径

    如果项目中加入了App,需要在 INSTALLED_APPS列表 中加入App名字,如:
    在这里插入图片描述

5. 静态资源

静态资源指,网站中不变的文件。静态资源包括 CSS文件、JavaScript文件 以及 图片等资源文件。

  • CSS(层叠样式表)一种用来表现 HTML 或 XML 文件样式的计算机语言。
  • JavaScript是一种直译式脚本语言在HTML网页上使用,用于给网页增加动态功能。

静态文件存放在配置文件 settings.py文件上,如下:在这里插入图片描述
上述配置将静态资源存放在文件夹 static,这个文件夹只能放在App里面。
项目启动时,Django根据静态资源存放路径查找相关文件,查找功能由App列表 INSTALLED_APPS 的 staticfiles 实现。在 index App 中添加 ‘ python package ’ 并放置文件。
在这里插入图片描述
启动项目后,浏览器访问:http://127.0.0.1:8000/static/FileName

如果想在 djangoDemo 的根目录下存放静态资源,可以在 settings.py 中设置 STATICFILES_DIRS 属性。该属性以列表形式表示,设置方式如下
在这里插入图片描述
分别在根目录下 创建文件夹public_static,在 App(index)下创建 index_static 文件夹
在这里插入图片描述
在这里插入图片描述

5. 模板(template)路径

模板是一种较为特殊的HTML文档。这个文档中嵌入了一些Python识别的变量和指令,然后程序解析这些变量和命令,生成完整的 HTML 网页并返回给用户浏览MTV框架中的T

创建项目时,Django已初始化模板配置信息:
在这里插入图片描述
在项目根目录 index 下分别创建 templates 文件夹,并在文件夹下创建 index.html 和 app_index.html
在这里插入图片描述
根目录 templates 通常存放共用的模板文件,能够提供各个App的模板文件调用,该模板符合代码重复使用原则,
如HTML的 部分。index 的 templates 是存放当前App所需的模板文件。模板配置如下:
在这里插入图片描述

6. 数据库配置

选择项目所使用的数据库类型,不同数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django提供四种数据库引擎:
在这里插入图片描述
项目创建时,默认 sqlite3数据库,这是一款轻型的数据库,常用于嵌入式系统开发,配置信息如下
在这里插入图片描述
如果把上述连接信息修改为MySQL数据库,首先 安装MySQL连接模块‘ mysqlclient ’ ,
输入命令:

在线安装:pip install mysqlclient 

离线安装:pip install --no-index --find-links=file:E:\360Downloads\Software\packages\Python插件\ mysqlclient-1.4.1-cp37-cp37m-win_amd64.whl

安装后,在Python Console进行验证
在这里插入图片描述
完成 mysqlclient 模块安装后,配置 settings.py 的 MySQL连接信息,如下:
在这里插入图片描述
Django 除了支持 PostgreSQL、Sqlite3、MySQL 和 Oracle以外,还支持 SQLServer 和 MongoDB 的连接

7. 中间件

中间件 是处理 Django 的 request请求response对象 的过程。当用户在网站中进行某个按钮等操作时,这个动作是用户向网站发送request请求,而网站根据操作返回相关内容,这个过程叫 response
在这里插入图片描述

一般情况下,Django 默认的中间件配置均可满足大部分的开发需求。在MIDDLEWARE中添加LocalMiddleware中间件,使得Django内置功能支持中文显示,如下:
在这里插入图片描述

中间件说明:

SecurityMiddleware SessionMiddleware CommonMiddleware CsrfViewMiddleware AuthenticationMiddleware 
MessageMiddleware XFrameOptionsMiddleware LocalMiddleware

内置安全机制,保护用户与网站通信安全 会话Session功能 处理请求信息,规范化请求内容 开启CSRF防护功能 
开启内置用户验证系统 开启内置信息提示功能 防止恶意程序点击劫持 支持中文语言

三、编写URL规则:

路由说明

在这里插入图片描述

URL(Uniform Resource Locator,统一资源定位符) 是互联网上标准资源地址。用于指出文件的路径位置。Django中,URL 也称为 URLconf。

每个App中设置 独立的静态资源 和 模板文件夹 并添加一个.py文件,命名为 urls.py
在这里插入图片描述
在App的 urls.py 中写入对应URL,项目根目录 urls.py 来管理每个App中的 urls.py文件。根目录下 urls.py 编写URL规则如下:

项目目录下的 urls.py
在这里插入图片描述

from django.contrib import admin   
from django.urls import path,include

urlpattern = [
    path('admin/',admin.site.urls),
    path('',include('index.urls'))
] 

在这里插入图片描述
在这里插入图片描述
index 的 urls.py 编写规则与根目录 urls.py 大致相同,基本上所有的URL都是有固有的编写格式。 上述代码导入了同一目录下的 views.py 文件,该文件用于编写视图函数,处理URL请求信息并且返回网页给用户。代码如下:
在这里插入图片描述
index函数必须设置参数 request,该参数代表当前用户的请求对象。
包括:用户名,请求内容,请求方式等信息。启动 djangoDemo 项目后运行结果如下:
在这里插入图片描述

1、带变量的URL

日常开发过程中,有时一个URL可以代表多个不同的页面,如 编写带有日期的URL,根据前面编写方式,按照一年计算,需要开发者编写365个不同的URL才能实现,这种做法显然不可取,因此 Django 在编写 URL 时,需要对 URL 设置变量,使URL具有多样性。

URL的变量类型有字符类型、整型、slug 和 uuid,最为常见的是字符型和整型。
字符类型: 匹配任何非空字符串,不含斜杠。没有指定类型时,默认该类型
整型: 匹配 0 和正整数
slug: 可以理解为注释、后缀或附属等概念
uuid: 匹配一个 uuid格式的对象 UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准

根据上述变量类型,在 index 的 urls.py 里添加带有 字符类型整型slug 的URL地址信息,代码如下:
在这里插入图片描述
在URL中使用变量符号 “<>” 可以为URL设置变量。括号里面以冒号划分为两部分,前面代表 变量类型,后面代表 变量名称,变量名称可自定义。

上述URL中设置三个变量值,分别是

<year>、 <int:month>、 <slug:day>,

变量说明如下:

● <year>	    变量名为 year ,数据格式为字符类型,与 <str:year> 含义一样 
● <int:month>	变量名为 month ,数据格式为 整型 
● <slug:day>    变量名为 day ,数据类型为 slug 然后在 views.py 中编写视图函数 mydate 的处理方法,代码如下:

在这里插入图片描述
视图函数mydate有四个函数参数,其中year、month和day来自URL的变量。
URL的变量和试图函数要一一对应,如果试图函数的参数 与 URL变量 对应不上会抛出异常。

项目启动如下:
在这里插入图片描述

2、设置参数name

除了URL里面设置变量之外,Django还可以对URL进行重命名。在 index 的 urls.py 、views.py 和 模板myyear.html 中添加如下代码:

urls.py
在这里插入图片描述

views.py在这里插入图片描述
创建 templates文件夹,并且在 templates文件夹 中 添加 myyear.html文件

在这里插入图片描述
上述代码分别从 URL、视图函数、HTML模板 来说明name具体作用:

  1. 用户访问URL,项目根据URL信息选择试图函数myyear处理,并且将URL命名myyear
  2. 视图函数myyear将模板myyeear.html作为响应内容弄个并且生成相应的网页返回给用户
  3. 在模板 myyear.html 中分别设置两个标签a , 虽然两个标签a的 href属性值的写法有所不同,但实质两者都指向名为myyeear的URL地址信息。
  4. 第二个标签a的href为{% url ‘myyear’ 2018%},这是Django的模板语法,模板语法以{% %}表示。 其中,url ‘myyear’ 是将命名为myyear的URL地址信息作为href属性值 运行结果如下:
    在这里插入图片描述

四、探究视图

视图(View)
是Django的 MTV框架结构的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面及其他类型文档中显示。也可以理解为视图是MTV框架里面的C部分(控制器),主要处理功能和业务上的逻辑。

1.构建网页内容

我们可以看到视图函数都是通过return方式返回数据内容的,然后生成相应的网页内容呈现在浏览器上。
而视图函数的 return 具有多个响应类型如下:
在这里插入图片描述
在这里插入图片描述
响应类型代表HTTP状态码,其核心作用是Web Server服务器用来告诉客户端-当前Web服务器的响应状态。上述响应主要来自于模块django.http,该模块是实现响应功能的核心。实际开发中,使用该模块实现文件下载功能,在 index的urls.py 和 views.py中分别添加以下代码:

  • urls.py 代码
    在这里插入图片描述
  • views.py 代码
    在这里插入图片描述
    上述文件下载功能说明如下:
  1. 接收到用户请求后,试图函数 download 首先定义 HttpResponse 的响应类型文件(text/csv)类型,生成response对象
  2. response对象上定义 Content-Disposition(Content-Disposition 响应头,设置文件在浏览器打开还是下载),设置浏览器下载文件的名称。attachment设置文件的下载方式,filename为文件名。
  3. 使用CSV模块加载 response对象,把数据 如 response对象所设置的CSV文件,并将 response对象返回到浏览器上,从而实现文件下载。

访问 http://127.0.0.1:8000/download.html 从而实现文件下载,运行如下:
在这里插入图片描述
django.http 除了实现文件下载外,要使用该模块生成 HTML网页,可以在响应内容中编写HTML源码,如:

HttpResponse('<html><body>...</body></html>')。

但不适合实际开发。

Django在 django.http模块 上进行了封装,从而有了 render()、render_to_response() 和 redirect()函数

render( ) 和 render_to_response( ) 实现功能一致。
render_to_response( ) 在2.0版本之后开始弃用。

render( )语法如下:
在这里插入图片描述
函数 render() 的参数 request 和 template_name 是必须参数,其余参数是可选参数。各个参数说明如下:

  • request: 浏览器向服务器发送请求对象,包括用户信息、请求内容、请求方式等
  • template_name:HTML模板文件名,用于生成 HTML网页
  • context: 对HTML模板的变量赋值,以字典形式表示,默认是空字典
  • content_type: 响应数据的数据格式
  • status: HTTP状态码,默认为200
  • using: 设置 HTML模板 转换生成 HTML网页的模板引擎

在项目 index APP 中的 templates 放置 华为商城首页-重命名为 index.html,static用于存放该 HTML模板的静态资源。

我们在 urls.pyviews.py 中编写如下代码:
在这里插入图片描述
在这里插入图片描述
从视图函数的 context={‘title’:‘首页’} 可知,将 index.html 模板变量的 title值 设置成首页,返回状态码是 500。

启动项目后,运行结果如下:
在这里插入图片描述除了 render函数 外,还有 **redirect()**函数。redirct()函数用于实现请求重定向。

重定向的链接以字符串形式表示,链接地址信息可以支持相对路径和绝对路径,代码如下:

  • urls.py
    在这里插入图片描述
  • views.py
from django.shortcuts import render,redirect
from django.http import HttpResponse
import csv

在这里插入图片描述

2. 数据可视化

视图除了接收用户请求、返回内容之外,还可以与模型(Model)实现数据交互(操作数据库)。

视图相当于一个处理中心,负责接收用户请求,然后根据请求信息读取并处理后台数据,最后生成HTML网页返回给用户

视图操作数据库实质是从 models.py 导入数据库映射对象,models.py 的数据库对象是通过 Django内置的 ORM框架 构建数据库映射的,从而生成数据库对象。我们在 index 的 models.py 中编写如下代码:
在这里插入图片描述

上述代码将 Product类数据表Product 构成映射关系,代码只是搭建两者的关系,数据库中,没有生成响应数据表。

在 PyCharm 的 Terminal窗口 或者 打开安装应用中的 Anaconda Prompt 终端,使用:
在这里插入图片描述
python manage.py XXX指令 通过 Product类 创建数据表Product类

创建命令如下:

python manage.py makemigrations 
  python manage.py migrate

根据 model.py 生成相关的 .py文件,该文件用于创建数据表:
在这里插入图片描述
创建数据表:
在这里插入图片描述
指令执行完成,数据库中可以看到新创建的数据表,如下:

连接数据库

mysql -u root -p

查看表

show tables

在这里插入图片描述

当命令执行完成后,Django会默认创建多个数据表,其中 index_product 对应 index 的 models.py 所定义的 Product类,其余的数据表都是Django内置功能生成的,主要用于 Admin站点、用户认证和Session会话 等功能。

在数据表 index_product 中添加数据:
在这里插入图片描述
完成数据表的数据添加后,接着将数据表的数据展现在网页上。

首先将模板文件 index.html 左侧导航栏的代码注释掉,如下:
在这里插入图片描述
添加新的代码:
在这里插入图片描述
新添加的代码是 Django的模块语法,主要 将视图的变量传递给模板,通过模板引擎转换成 HTML语言

上述代码使用的循环和判断语句对变量进行分析处理。最后在视图函数中编写代码,将数据表中的数据与模板连接起来,实现数据可视化,代码如下:
在这里插入图片描述
上述代码中,视图函数 index 处理流程如下:

  • type_list 用于查询数据表字段 type 的数据并将数据去重,name_list 用于查询数据字段 type 和 name 的全部数据,两种独特的查询方式都是由Django内置的ORM框架提供的。

  • 将查询所得数据以字典格式写入变量 context 中,变量 context 是 render()函数 的参数值,起作用是将变量传递给 HTML模板。

  • 当HTML模板接收到变量 type_list 和 name_list 后,模板引擎解析模板语法并生成 HTML文件,运行结果如下:
    在这里插入图片描述

从上述例子可以看到,如果想将数据库的数据展现在网页上,需要视图、模型、模板共同实现,实现步骤如下:

  • 定义数据模型,以类的方式定义数据表的字段。在数据库创建数据表时,数据表由模型定义的类生成。
  • 在视图导入模型所定义的类,该类也称为数据表对象,Django为数据表对象提供独有的数据操作方法,可以实现数据库操作,从而获取数据表的数据。
  • 视图获取数据后,将数据以字典、列表或对象的方式传递给HTML模板,并由模板引擎接受和解析,最后生成相应的HTML网页。

3. 获取请求信息

我们知道视图是由于接收并处理用户的请求信息,请求信息存放在视图函数的参数request中,为了进一步了解参数request的属性,在Pycharm中使用debug模式启动项目,并且在视图函数中设置断点,然后查看request对象的全部属性。

requst 的 8种 常用属性:

HttpRequest.scheme     请求的协议
HttpRequest.body       请求体
HttpRequest.path       请求路径 
HttpRequest.method     请求方法 
HttpRequest.encoding   请求的字符集 
HttpRequest.GET        请求的GET数据 
HttpRequest.POST       请求的POST数据 
HttpRequest.META       请求的META属性**

上述属性中 GET、POST、和 method 是每个Web开发人员必须掌握的基本属性。其中 GET 和 POST 用于获取用户的请求参数,method 用于获取用户的请求方法。

以视图函数 login 为例,写入如下代码:

  • urls.py
    在这里插入图片描述
  • views.py
    在这里插入图片描述

视图函数 login 分别使用 GET、POST 和 method,说明如下:

首先使用 method 对用户请求方式进行判断,
一般情况下,用户打开浏览器访问某个URL地址都是GET请求;
而在网页上输入信息并点击某个按钮时,POST请求居多,如用户登录、注册等。

如果判断请求方式时 POST(GET)则通过 POST(GET)来获取用户请求参数。
不同的请求方式需要使用不通过的属性来获取用户提交的请求参数。

启动项目,在浏览器上分别输入以下URL地址:

http://127.0.0.1:8000/login.html

http://127.0.0.1:8000/login.html?name=Tom

运行结果如下:
在这里插入图片描述
在这里插入图片描述

4. 通用视图

Web开发是一项无聊而单调的工作,特别是在视图编写功能方面更为显著。为了减少这类痛苦,Django植入了通用视图这一功能,该功能封装视图开发常用代码和模式,可以在无需编写大量代码情况下,快速完成数据视图的开发。

通用视图是通过定义和声明类的形式实现的,根据用途划分为三大类:

TemplateView、ListView、DetailView

三者说明如下:

TemplateView   直接返回HTML模板,但无法将数据库展示出来
ListView       能将数据库的数据传递给HTML模板,通常获取某个表的所有数据
DetailView     能将数据库的数据传递给HTML模板,通常获取数据表的单挑数据

我们将视图函数改用 ListView 实现。沿用 index.html 模板文件,然后在 urls.py 中添加 URL地址信息,代码如下:

  • urls.py

    from django.urls import path, re_path
    from  . import views
    
    urlpatterns = [
    path('index/', views.ProductList.as_view())
    ]
    

如果URL所置县过的处理程序是由通用视图执行的,那么编写URL是,URL所指向的处理程序应当是一个通用视图,并且该通用视图必须使用 as_view()方法,因为通用视图实质上是一个类,使用 as_view()方法 相当于对类进行实例化并由类方法 as_view() 执行处理。

最后 views.py 中编写视图 ProductList 代码:如下:
在这里插入图片描述
ProductList 代码说明如下:

  1. 定义ProductList类,该类继承自ListView类,具有ListView的所有属性
  2. context_object_name 设置HTML模板的变量
  3. template_name 设置HTML模板
  4. queryset 查询数控数据,查询结果赋值给 context_object_name 所设置的变量
  5. 重写函数 get_queryset ,该函数功能与 query_set 实现功能一致
  6. 重写函数 get_context_data , 该函数设置HTML模板的其他变量

五、深入理解模板

1. 变量与标签

变量是模板中最基本的组成单位,模板变量是由视图函数生成的。变量以{{variable}}表示,variable是变量名,变量类型可以是Python支持的数据类型,使用方法如下:

#  variable为字符串类型或整型,如 variable='Python'
  {{variable}}

# 输出Python

# variable为字典或数据对象,通过点号(.)来访问其属性值

# 如variable={"name":"Lily","info":{"home":"Beijing","homeplace":"ShangHai}}
{{variable.name}}

#输出Lily

{{variable.info.home}}
#输出Beijing

以MyDjango为例,抽取 index.html 部分代码,代码如下:

<head>
   <title>{{ title }}</title>
   <meta charset="utf-8">
   {% load staticfiles %}
   <link rel="stylesheet" type="text/css" href="{% static "css/hw_index.css" %}" >
   <link rel="icon" href="{% static "img/hw.ico" %}">
   <script src="{% static "js/hw_index.js" %}"></script>
</head>
<body>

<ul id="cate_box" class="lf">
    {% for type in type_list %}
    <li>
       <h3><a href="#">{{ type.type }}</a></h3>
         <p>
             {% for name in name_list %}
                 {% if name.type == type.type %}
                      <span>{{ name.name }}</span>
                 {% endif %}
             {% endfor %}
         </p>
    </li>
    {% endfor %}
</ul>

上述代码分别使用模板的变量和标签,说明如下:

1. {{ title }} 代表模板变量,从变量名title可以知道,变量的数据类型是字符串或整型 
2. {% load staticfiles %}             是模板的内置标签,load标签用于导入静态资源信息 
3. {% static "css/hw_index.css" %}    是模板的内置标签,static标签用于读取静态资源的文件内容 
4. {% for type in type_list %}        是for遍历标签,将变量进行遍历输出 
5. {% if name.type == type.type %}    是if判断标签,主要对变量进行判断处理 
6. {{ type.type }}   代表变量 type_list 的某个属性

在这里插入图片描述
在这里插入图片描述
在上述常用标签中,每个标签的使用方法都是各不相同的。我们通过简单的例子进一步了解标签的使用方法,代码如下:

 # for标签,支持嵌套,myList可以是列表或某一个对象
    # item可自定义命名,{% endfor %}代表循环去终止符,代表该区域代码由for循环输出
     {% for item in myList %}
     {{ item }}
     {% endfor %}

    # if标签,支持嵌套,判断条件符必须与变量之间使用空格隔开,否则程序会抛出异常
    # {% endif %}与{% endfor %}作用是相同的
     {% if name = 'Lily' %}
     {{name}}
     {% elif name = 'Lucy' %}
     {{name}}
     {% else %}
     {{name}}
     {% endif %}

    # url标签
    # 生成不带变量的URL地址
    # 相关的路由地址:path('search/<int:page>.html',views.search,name='search')
    # 字符串search是URL的参数name的值,1是URL的变量page的值
    <a href="{% url 'search' 1 %}" target="_blank">第一页</a>

    # total标签
     {% with total = products_total %}
     {{ total }}
     {% endwith %}

    # local标签,导入静态文件标签库staticfiles,staticfiles来自settings.py的INSTALLED_APPS
     {% load staticfiles %}

    # static标签,来自讲台文件标签库staticfiles
     {% static "css/hw_index.css" %}

在 for标签 中,模板还提供一些特殊的变量来获取for标签的循环信息,说明如下:

forloop.counter       循环的当前索引值,从1开始计数;常用于生成一个表格或者列表的序号! 
forloop.counter0      循环的当前索引值,从0开始计数; 
forloop.revcounter    循环结束的次数(从1开始) 
forloop.revcounter0   循环结束的次数(从0开始) 
forloop.first      判断当前是否循环的第一次,是的话,该变量的值为True。我们经常要为第一行加点特殊的对待,就用得上这个判断了,结合if。 
forloop.last    如果这是最后一次循环,则为真 
forloop.parentloop   对于嵌套循环,返回父循环所在的循环次数。某些场景下,这是个大杀器,能解决你很多头疼的问题。

上述变量来自于forloop对象,该独享的模板引擎解析 for标签 时所称城的。举例如下:

  {% for name in name_list %}
    {% if forloop.counter == 1 %}
        <span>这是第一次循环</span>
    {% elif forloop.last %}
        <span>这是最后一次循环</span>
    {% else %}
        <span>本次循环次数为{{ forloop.counter }}</span>
    {% endif %}
    {% endfor %}

2. 模板继承

模板继承是通过模板标签实现的,其作用是将多个HTML模板的共同代码集中在一个新的HTML模板中,然后各个模板可以通过调用新的HTML模板,从而生成新的HTML网页,减少模板间代码重复使用。代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    <a href="{% url 'index' %}" target="_blank">首页</a>
    <h1>Hello Django</h1>
</body>
</html>

上述代码是一个完整的HTML模板,一个完整的模板有 <head> 和 <body> 两大部分,其中<head>部分在大多数情况下都是相同的,
因此可以将<head>部分写道同用模板中,将共用模板命名为 base.html,代码如下:
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>{{ title }}</title>
</head>
<body>
    {% block body %}{% endblock %}
</body>
</html>

在base.html的代码中可以看到,<body>里的内容变为 {% block body %}{% endblock %} ,block标签相当于一个函数,
body是对该函数的命名,开发者可自行命名。在一个模板中可以添加多个block标签,只要每个 block标签 的命名不相同即可。
接着在模板 index.html 中调用共同模板 base.html ,代码如下:
 {% extends "base.html" %}
 {% block body %}
 <a href="{% url 'index' %}" target="_blank">首页</a>
 <h1>Hello Django</h1>
 {% endblock %}

模板 index.html 调用统统模板 base.html 的实质是由模板继承实现的,调用步骤如下:

  1. 在模板 index.html 中使用 {% extends “base.html” %} 来继承 base.html
  2. 由标签 {% block body %} 在继承模板的基础上实现自定义的模板内容
  3. 由 {% endblock %} 结束block标签

3. 自定义过滤器

过滤器主要是对变量内容进行处理,例如替换、逆序、转义等。通过过滤器处理变量可以将变量的数据格式和内容转化为我们想要的效果。使用方法如下:

{{ variable | filter }}

模板引擎解析带过滤器的变量时,首先通过 filter 处理变量 variable ,然后将处理后的变量显示在网页上。其中,variable 代表模板变量,管道符号 ‘|’ 代表变量使用过滤器,filter 代表某个过滤器。变量可以支持多个过滤器同时使用,如下:

{{ variable | filter | lower}}

在使用的过程中,某些过滤器还可以传入参数,但仅支持一个参数的传入。带参数过滤器的使用方法如下:

{{ variable | date:"D d M Y"}}

Django为开发者提供内置过滤器:https://www.cnblogs.com/waltsmith/p/8088099.html

实际开发中,如果内置过滤器不符合开发需求,我们需要自定义过滤器来解决问题。首先在 MyDjango 中添加文件和文件夹,如下:
在这里插入图片描述
在 MyDjango项目中添加 user_defined 文件夹,该文件夹下继续添加文件夹 templatetags。

templatetags 用于存放自定义过滤器的代码文件,该文件夹也可以存放在项目的App中,但是需要注意的是,文件夹的命名必须为templatetags,否则 Django 在运行的时候无法识别自定义过滤器。最后,在 templatestags 文件夹下创建 myfilter.py 文件,该文件的编写自定义过滤器的实现代码。

完成过滤器目录搭建,接着是配置过滤器信息,在配置文件 settings.py 的 INSTALLED_APPS 里面添加 user_defined。当项目启动时,Django会从 INSTALLED_APPS 的配置中查找到过滤器,若过滤器设置在 index 的目录下,则只需在 INSTALLED_APPS 配置 index 即可,如下:
在这里插入图片描述
完成上述两个环境配置后,编写自定义过滤器代码 myfilter.py 中添加以下代码

 from django import template
    
    # 声明一个模板对象,也成为注册过滤器
    
    register = template.Library()
    
    # 声明并定义过滤器
    
    @register.filter
    def myreplace(value, args):
        oldValue = args.split(':')[0]
        newValue = args.split(':')[1]
        return value.replace(oldValue, newValue)

上述代码用于实现 HTML模板的字符串替换功能,与Python的 replace函数 相同,说明如下:

  1. 导入模板功能 template,通过 template 声明 Library 对象,给对象赋值给 register,称为注册过滤器
  2. 过滤器以函数形式实现,在函数前使用 register.filter 装饰器表示该函数是一个过滤器
  3. 函数参数可设置一个或两个,上述参数分别为 value 和 args,value是HTML模板的变量,参数args是过滤器函数定义的函数参数
  4. 过滤函数最后必须将处理结果返回,否则出现异常

最后HTML模板中使用我们自定义的过滤器,以 index.html模板 的title为例,代码如下:

 {% load myfilter %}
    <!DOCTYPE html>
    <html>
    <head>
        <title>{{ title | myreplace:'首页|我的首页' }}</title>
        <meta charset="utf-8">
        {% load staticfiles %}
        <link rel="stylesheet" type="text/css" href="{% static "css/hw_index.css" %}" >
        <link rel="icon" href="{% static "img/hw.ico" %}">
        <script src="{% static "js/hw_index.js" %}"></script>
    </head>
    <body>

在HTML模板中使用自定义过滤器可以分为两个步骤,说明如下

  1. {% load staticfiles %} 用于导入 templatetags 文件夹的 myfilter.py 文件中所定义的功能,用来告诉 Django 在那个地方可以找到自定义过滤器。
  2. {{ title | myreplace:‘首页|我的首页’ }}把变量 title 含有‘首页’的内容替换成‘我的首页’。其中,myreplace 是过滤器的函数名,‘首页:我的首页’是函数 参数args 的值,函数参数value 的值为模板变量 title 的值。
    在这里插入图片描述

六、模型与数据库

Django对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite 和 Oracle,并且为这些数据库提供统一的调用 API,这些API统称为ORM框架。通过使用Django内置ORM框架可以实现数据库连接和读写操作。

1.构建模型

ORM框架是一种程序技术,用于实现面向对象编程语言中不同类型系统的数据之间的转换。 从效果上说,其实是创建了一个可在编程语言中使用的"虚拟对象数据库",通过对虚拟对象数据库操作从而实现对目标数据库的操作,虚拟对象数据库与目标数据库是相互对应的。在Django中,虚拟对象数据库也成为模型。通过模型实现对目标数据库的读写操作,实现方法如下:

  • 配置目标数据库信息,主要在settings.py中设置数据库信息
  • 构建虚拟对象数据库,在App的modle.py文件中以类的形式定义模型
  • 通过模型在目标数据库中创建相应的数据库
  • 在视图函数通过对模型操作实现目标数据库的读写操作
    在这里插入图片描述
    我们使用Navicat Prenium数据库管理工具查看mysql数据库的信息,如下:
    在这里插入图片描述
    在这里插入图片描述
    数据表只能通过模型创建,因为Django对模型和目标数据库之间由自身的映射规则,如果自己在数据库中创建数据表,可能不一定符合Django的见表规则,从而导致模型和目标数据库无法建立通信。在项目index的 models.py 文件 中定义模型,代码如下:
from django.db import models
  # Create your models here.
  # 创建产品分类表
  class Type(models.Model):
      id = models.AutoField(primary_key=True)
      type_name = models.CharField(max_length=20)
  # 创建产品信息表
  class Product(models.Model):
      id = models.AutoField(primary_key=True)
      name = models.CharField(max_length=50)
      weight = models.CharField(max_length=20)
      size = models.CharField(max_length=20)
      type = models.ForeignKey(Type, on_delete=models.CASCADE)

上述代码分别定义了 TypeProduct ,定义说明如下:

  1. 模板以 类的形式定义,继承Django的model.Model类。一个类代表目标数据库的一张数据表,类的命名一般首字母大写
  2. 模板的字段以类属性进行定义,如id = models.IntegerField(primary_key=True) 代表在数据表Type中命名一个id字段,该字段数据类型为整型并且设置为主键

完成模型定义后,接着在目标数据库中创建相应数据表,在目标数据库中创建表是通过Django的管理工具manage.py完成,创建命令如下:

根据 model.py 生疮相关 .py文件,该文件用于创建数据库:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值