锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

Django基礎

时间:2023-01-23 03:00:00 2韩国ket连接器

Django
一,简介

Django是开源代码Web应用框架,由Python写成。采用了MTV框架模式,即模型M,视图V和模板T。它最初是用来管理劳伦斯出版集团旗下的一些基于新闻内容的网站的CMS软件(内容管理系统)。并于2005年7月在BSD发布许可证。这个框架是比利时吉普赛爵士吉他手Django Reinhardt来命名的。
1,框架介绍

Django 项目是一个Python定制框架起源于在线新闻 Web 站点,于 2005 年以开源的形式释放。Django 框架的核心组件有:

用于创建模型的对象关系映射 为最终用户设计的完美管理界面 一流的 URL 设计 友好的模板语言设计师 缓存系统。 

Django(发音:[`d???ɡ??]) 是用python语言写作的开源web开发框架(open source web framework),它鼓励快速发展和遵循MVC设计。Django遵守BSD2005年7月首次发布版权, 第一个正式版本于2008年9月发布。.0 。

Django 爵士比利时的爵士乐家[Django Reinhardt](https://baike.baidu.com/item/Django Reinhardt)命名,他是吉普赛人,主要表演吉他,还表演小提琴等。

由于Django随着近年来的快速发展,应用越来越广泛,被命名IT开发杂志SD Times评选为2013 SD Times 100,位列“API、库与框架分类第六,被认为是该领域的领导者
2,架构设计

Django是一个基于MVC结构框架Django控制器接受用户输入的部分由框架处理,因此 Django 更注重模型(Model)、模板(Template)和视图(Views),称为 MTV模式。各自的职责如下:
层次 职责
模型(Model),即数据存取层 处理所有与数据相关的事务: 如何访问,如何验证有效性,包括哪些行为和数据之间的关系。
模板(Template),即表现层 与表现相关的决定: 如何在页面或其他类型的文档中显示?
视图(View),即业务逻辑层 获取模型和获取适当模板的相关逻辑。模型与模板之间的桥梁。

从上述表述可以看出Django 视图不处理用户输入,只决定向用户显示哪些数据Django 模板 只决定如何展示Django视图指定的数据。或者说, Django将MVC视图进一步分解为 Django视图 和 Django模板的两个部分分别决定 显示哪些数据 和 如何展示Django可根据需要随时更换模板,而不仅限于内置模板。

至于MVC由控制器部分Django框架的URLconf来实现。URLconf该机制采用正则表达式匹配URL,然后调用合适的Python函数。URLconf对于URL没有任何限制,你可以设计任何规则URL风格,无论是传统的,RESTful,或另类。框架把控制层给封装了,无非与数据交互这层都是数据库表的读,写,删除,更新的操作。写程序的时候,只需要调用相应的方法,感觉很方便。程序员把控制层交给控制层Django自动完成。 很多事情只需要编写很少的代码。所以,它比MVC因为我们的大多数程序员都在写控制层的程序,所以框架应该考虑更深层次的问题。现在这份工作交给了框架,只需要写很少的调用代码,大大提高了工作效率。
3,设计哲学

Django数据库驱动的网站开发简单快捷。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很容易地开发自己的工具包。这使得Django可扩展性强。它还强调快速发展和快速发展DRY(Do Not Repeat Yourself)原则。

Django基于MVC设计非常优美:

对象关系映射 (ORM,object-relational mapping):以Python定义您的数据模型,ORM将模型与关系数据库连接起来,您将获得一个非常容易使用的数据库API,你也可以在那里Django使用原始的SQL语句。 URL 分配:使用正则表达式匹配URL,你可以设计任何东西URL,没有具体的框架限制。和你喜欢的一样灵活。 模板系统:使用Django强大而可扩展的模板语言可以分隔设计、内容和Python代码。并且具有可继承性。 表单处理:您可以轻松生成各种表单模型,实现表单的有效性检验。从您定义的模型实例中生成相应的表单很容易。 Cache系统:可悬挂内存缓冲或其他框架,实现超级缓冲 -- 实现你需要的粒度。 会话(session),用户登录和权限检查,快速开发用户会话功能。 国际化:内置国际化系统,便于开发多语言网站。 自动化管理界面:您不需要花费大量的工作来创建人员管理和更新内容。Django自带一个ADMIN site,类似于内容管理系统 

4,工作机制

插入图片描述

1.用manage .py runserver 启动Django服务器在同一目录下载入settings .py。该文件包含项目中的配置信息,如上述信息URLConf等等,最重要的配置是ROOT_URLCONF,它告诉Django哪个Python本站应使用模块URLConf,默认的是urls .py

2.当访问url的时候,Django会根据ROOT_URLCONF装载的设置URLConf。

3.然后按顺序逐一匹配URLConf里的URLpatterns。如果发现,将调用相关的视图函数并将其放置HttpRequest对象作为第一个参数(通常是request)

4.最后该view函数负责返回一个函数HttpResponse对象
5,环境搭建

pip install django
6,第一个django项目

使用pycharm新建项目

插入图片描述

项目目录

插入图片描述

manage.py: 命令行工具允许以多种方式与项目互动。在CMD在窗下切换路径django项目下输入 python manage.py help查看工具的具体功能  init.py: 初始化文件通常不需要修改  settings.py: 项目配置文件  urls.py: 项目的URL设置,网站地址信息  wsgi.py: WebServerGatewayInterface服务器网关接口,Python应用与Web服务器之间的接口  templates:模板文件目录 

运行项目

插入图片描述

插入图片描述

到浏览器复制地址

插入图片描述

成功!!!

创建APP

项目创建完成后,创建项目应用,简称App,是网站的功能 每个App是网站的一页或多页 App的创建由manage.py实现

● cd myDjango,切换目录

● 使用manage.py创建app index

插入图片描述

● migrations: 用于数据库的迁移

● init.py: 初始化文件

● admin.py: 当前App后台管理系统

● app.py: 当前App配置信息通常不需要修改

● model.py: 在映射类相关数据库中定义,MTV中的Model

● tests.py: 模块自动化测试后

● views.py: 逻辑处理模块,MTV中的Views

修改配置文件

插入图片描述

urls.py和views.py代码:

插入图片描述
插入图片描述

重新启动项目

插入图片描述

访问项目

插入图片描述
二,Django配置信息

配置信息主要由项目组成settings.py实现文件的主要配置路径、密钥配置、域名访问权限、App列表、配置静态资源、配置模板文件、数据库配置、中间件、缓存配置。
信息的基本配置

项目路径、密钥配置、域名访问权限、App列表和中间件MyDjango项目为例,settings.py的基本配置如下:

插入图片描述

上述代码列出了项目路径BASE_DIR、密钥配置SECRET_KEY、调试模式DEBUG、访问权限ALLOWED_HOSTS和App列表INSTALLED_APPS,各配置说明如下:

项目路径BASE_DIR:主要通过os在系统中读取当前项目的具体路径,代码在创建项目时自动生成,通常不需要修改。  密钥配置SECURIT_KEY:它是项目创建时自动生成的随机值,通常不需要修改。主要用于加密重要数据,提高系统安全性。主要用于用户密码,CSRF机制(表格提交)session等数据加密。  调试模式DEBUG:这个值是布尔类型。开发阶段True,网上项目部署改为False。  域名访问权限ALLOWED_HOSTS:默认设置可访问域名为空。DEBUG=True同时ALLOWD_HOSTS空代表项目只允许localhost或者127.0.0.访问浏览器。DEBUG=False时ALLOWD_HOSTS设置为必填项ALLOWD_HOSTS=[‘xxx.xxx.xxx.xxx’]  App列表INSTALLED_APPS,告诉django有哪些App,现有配置信息如下:     admin 内置后台管理系统     auth 内置用户认证系统     contenttypes 在项目中记录model元数据     sessons Session会话功能,用于标识访问网站的用户身份信息
    messages 消息提示功能
    staticfiles 查找静态资源路径

​ 如果项目中加入了App,需要在INSTALLED_APPS列表中加入App名字,如

在这里插入图片描述
2,模板路径

模板是一种较为特殊的HTML文档。这个文档中嵌入了一些Python识别的变量和指令,然后程序解析这些变量和命令,生成完整的HTML网页并返回给用哦过户浏览。 MTV框架中的T。创建项目时,Django已初始化模板配置信息:

● BACKEND: 模板引擎,用于识别模板中的变量和指令

● DIRS: 设置模板所在路径,告诉Django模板位置

● APP_DIRS: 是否在App文件中查找模板文件

● OPTIONS: RequestContex中上下文的调用函数,通常不做修改

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
3,静态资源

静态资源指,网站中不变的文件。静态资源包括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文件夹

在这里插入图片描述

在这里插入图片描述
4,数据库配置

选择项目所使用的数据库类型,不同数据库需要设置不同的数据库引擎,数据库引擎用于实现项目与数据库的连接,Django提供四种数据库引擎:

在这里插入图片描述

项目创建时,默认sqlite3数据库,这是一款轻型的数据库,常用于嵌入式系统开发,配置信息如下:

在这里插入图片描述

如果把上述连接信息修改为MySQL数据库,首先安装MySQL连接模块‘mysqlclient’ ,输入命令: 在线安装:pip install mysqlclient 离线安装:pip install --no-index --find-links=file:所在目录\ mysqlclient-1.4.1-cp37-cp37m-win_amd64.whl

安装后,在Python Console进行验证

在这里插入图片描述

完成mysqlclient模块晚装后,配置settings.py的MySQL连接信息,如下

在这里插入图片描述

Django除了支持PostgreSQL、Sqlite3、MySQL和Oracle以外,还支持SQLServer和MongoDB的连接
5,中间件

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

在这里插入图片描述

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

在这里插入图片描述

SecurityMiddleware 内置安全机制,保护用户与网站通信安全

SessionMiddleware 会话Session功能

CommonMiddleware 处理请求信息,规范化请求内容

CsrfViewMiddleware 开启CSRF防护功能

AuthenticationMiddleware 开启内置用户验证系统

MessageMiddleware 开启内置信息提示功能

XFrameOptionsMiddleware 防止恶意程序点击劫持

LocalMiddleware 支持中文语言
三,编写URL规则

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

每个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
urlpatterns=[
path(‘admin/’,admin.site.urls),
path(’’,include(‘index.urls’)
]

1
2
3
4
5
6
7
8

导入Admin功能模块 导入URL编写模块 整个项目URL集合,每个元素代表一条URL信息 设定Admin的URL(127.0.0.1:8000/admin) URL为空,代表网站域名(127.0.0.1:8000)

首页地址分发给了index的urls.py处理,因此需要配置index的urls.py编写信息,代码如下:

在这里插入图片描述

index的urls.py编写规则与根目录urls.py大致相同,基本上所有的URL都是有固有的编写格式。 上述代码导入了同一目录下的views.py文件,该文件用于编写视图函数,处理URL请求信息并且返回网页给用户。代码如下:

在这里插入图片描述

index函数必须设置参数request,该参数代表当前用户的请求对象。包括:用户名,请求内容,请求方式等信息。启动djangoDemo项目后运行结果如下:

在这里插入图片描述
2,带变量的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中设置三个变量值,分别是、int:month、slug:day,变量说明如下:

● 变量名为year,数据格式为字符类型,与str:year含义一样

● int:month 变量名为month,数据格式为整型

● slug:day 变量名为day,数据类型为slug

然后在views.py中编写视图函数mydate的处理方法,代码如下:

在这里插入图片描述

视图函数mydate有四个函数参数,其中year、month和day来自URL的变量。URL的变量和试图函数要一一对应,如果试图函数的参数与URL变量对应不上会抛出异常。项目启动如下:

在这里插入图片描述
3,设置参数name

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

urls.py:

在这里插入图片描述

views.py:

在这里插入图片描述

创建templates文件夹,并且在templates文件夹中添加myyear.html文件

在这里插入图片描述

上述代码分别从URL、视图函数、HTML模板来说明name具体作用:

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

在这里插入图片描述
4,设置额外参数

除了参数name之外,还有一种参数类型是以字典的数据类型传递的,该参数没有具体命名,只要是字典形式即可,而且该参数只能在试图函数中读取和使用。

#参数为字典的url
re_path(‘dict/(?P[0-9]{4}).htm’,views.myyar_dict,{‘month’:‘05’},name=‘myyar_dict’)
#参数为字典的url的视图函数
def myyar_dict(request,year,month):
return render(request,‘myyar_dict.html’,{‘month’:month})

1
2
3
4
5

myyar_dict.html:

在这里插入图片描述
四,视图

视图(View)是Django的MTV框架结构的V部分,主要负责处理用户请求和生成相应的响应内容,然后在页面及其他类型文档中显示。也可以理解为视图是MVC框架里面的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(’…’)。但不适合实际开发。Django在django.http模块上进行了封装,从而有了render()、render_to_response()和redirect()函数。

​ render()和render_to_response()实现功能一致。render_to_response()在2.0版本之后开始弃用。render()语法如下:

在这里插入图片描述

函数render()的参数request和template_name是必须参数,其余参数是可选参数。各个参数说明如下:

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

​ 在项目index APP中的templates放置 华为商城首页-重命名为index.html,static用于存放该HTML模板的静态资源。我们在urls.py和views.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

1
2
3
4

在这里插入图片描述
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

1
2

#根据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语言。上述代码使用的循环和判断语句对变量进行分析处理。最后在视图函数中编写代码,将数据表中的数据与模板连接起来,实现数据可视化,代码如下:

from .models import Product

在这里插入图片描述

上述代码中,视图函数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())
]

1
2
3
4
5
6

​ 如果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模板的其他变量

通用视图的代码编写规则有一定的固定格式,根据这个固定格式可以快速开发数据视图,除此之外,通用视图还可以获取URL的参数和请求信息,使得通用视图更加灵活。

urls.py:

path(‘index/.html’,views.ProductList.as_view(),{‘name’:‘phone’})

1

通用视图ProductList类

def get_queryset(self):
#获取url变量的id
print(self.kwargs[‘id’])
#获取url参数name
print(self.kwargs[‘name’])
#获取请求方式
print(self.request.method)
type_list = Product.objects.values(‘type’).distinct()
return type_list

1
2
3
4
5
6
7
8
9

五,模板
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

1
2
3
4
5
6
7
8
9
10

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

{​{ title }} {% load staticfiles %}
  • {% for type in type_list %}
  • { { type.type }}

    {% for name in name_list %} {% if name.type == type.type %} { { name.name }} {% endif %} {% endfor %}

  • {% endfor %}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

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

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的值

第一页

total标签

{% with total = products_total %}
{ { total }}
{% endwith %}

load标签,导入静态文件标签库staticfiles,staticfiles来自settings.py的INSTALLED_APPS

{% load staticfiles %}

static标签,来自讲台文件标签库staticfiles

{% static “css/hw_index.css” %}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

在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 %}
这是第一次循环
{% elif forloop.last %}
这是最后一次循环
{% else %}
本次循环次数为{ { forloop.counter }}
{% endif %}
{% endfor %}

1
2
3
4
5
6
7
8
9

2,模板继承

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

{​{ title }} 首页

Hello Django

1
2
3
4
5
6
7
8
9
10
11

上述代码是一个完整的HTML模板,一个完整的模板有和两大部分,其中部分在大多数情况下都是相同的,因此可以将部分写道同用模板中,将共用模板命名为base.html,代码如下:

{​{ title }} {% block body %}{% endblock %}
1
2
3
4
5
6
7
8
9
10

在base.html的代码中可以看到,里的内容变为{% block body %}{% endblock %},block标签相当于一个函数,body是对该函数的命名,开发者可自行命名。在一个模板中可以添加多个block标签,只要每个block标签的命名不相同即可。接着在模板index.html中调用共同模板base.html,代码如下:

{% extends “base.html” %}
{% block body %}
首页

Hello Django

{% endblock %}
1
2
3
4
5

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

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

3,自定义过滤器

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

{ { variable | filter }}

1

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

{ { variable | filter | lower}}

1

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

{ { variable | date:“D d M Y”}}

1

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)

1
2
3
4
5
6
7
8
9

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

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

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

{% load myfilter %}

{​{ title | myreplace:'首页|我的首页' }} {% load staticfiles %}

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

{% load staticfiles %}用于导入templatetags文件夹的myfilter.py文件中所定义的功能,用来告诉Django在那个地方可以找到自定义过滤器。
{
    
       { 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)

1
2
3
4
5
6
7
8
9
10
11
12
13

上述代码分别定义了Type和Product,定义说明如下:

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

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

#根据model.py生疮相关.py文件,该文件用于创建数据库

在这里插入图片描述

#创建数据表

在这里插入图片描述

在目标数据库中创建数据表需要执行两次命令,分别是makemigrations和migrate指令。创建过程说明如下:

​ makemigrations指令用于将index所定义的模型生成0001_initial.py文件,该文件放在index的migrations文件夹,打开0001_initial.py文件,其文件内容如下:

在这里插入图片描述

0001_initial.py文件将model.py的内容生成数据表脚本代码。而migrate指令更加脚本代码在目标数据库中生成相应数据表。指令完成后,可在数据库中查看到已创建的数据表,如下:

在这里插入图片描述

数据表index_product和index_type是由index的模型所创建的,分别对应模型Product和Type。其他数据表是Django内置功能所使用的数据表,分别是session、用户认证管理和Admin日志记录等。

我们创建了index_prodect和index_type,而表字段是在模型中定义的,在哦行Type和Product中定义的字段类型由整型和字符类型,但实际开发中,我们需要定义不同的数据类型满足各种要求,因此Django划分了多种不同的数据类型,如下:

在这里插入图片描述

Django提供的字段类型还会对数据进行正则处理和验证功能,进一步完善数据的严谨性。除了表字段类型外,每个表字段还可以设置相应的参数,让字段更加完善。字段说明如下:

在这里插入图片描述
2,数据表的关系

一个模型对应目标数据库的一个数据表,每个数据表之间也是存在关联的,表与表之间由三种关系:一对一、一对多、多对多。

​ 一对一存在两个数据表中,第一个表的某一行数据与第二个表的某一行数据相关,同时第二个表的某一行数据也至于第一个表的某一行数据相关,这种关系称为一对一关系。
ID 姓名 国籍 参加节目
1001 王大锤 中国 万万没想到
1002 李光洙 韩国 Running Man
1003 高晓松 未知 晓说
ID 出生日期 逝世日期
1001 1988 NULL
1002 1981 NULL
1003 未知 NULL

两个表中,ID分别一一对应,而且不会在同一个表中有重复的ID,使用这种关系通常是一个数据表中有太多字段,将常用的字段抽取出来并组成一个新的数据表。在模型中可以通过OneToOneField来构建表的一一对应关系,代码如下:

class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)
masterpiece = models.CharField(max_length=50)

class Performer_info(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.OneToOneField(Performer,on_delete=models.CASCADE)
birth = models.CharField(max_length=20)
elapse = models.CharField(max_length=20)

1
2
3
4
5
6
7
8
9
10
11

在这里插入图片描述
使用Django管理工具manage.py创建数据表Performer和Performer_info,创建数据表前最好删除0001_initial.py文件并清空数据库中的数据表。如下:

在这里插入图片描述

一对多存在于两个或两个以上的数据表中,第一个表的数据可以与第二个表的一行到多行数据进行关联,但第二个表的每一行数据只能与第一个表的某一行进行关联,如下:
ID 姓名 国籍
1001 王大锤 中国
1002 李光洙 韩国
1003 高晓松 未知
ID 参加节目
1001 万万没想到
1002 Running Man
1003 晓说
1003 奇葩说

表1字段ID的数据可以重复并且在表2中找到对应数据,而表1字段ID是唯一的,这是一种最常见的表关系。在模型中可以通过ForeignKey来构建一对多关系,代码如下:

class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)

class Program(models.Model):
id = models.IntegerField(primary_key=True)
performer = models.ForeignKey(Performer,on_delete=models.CASCADE)
name = models.CharField(max_length=20)

1
2
3
4
5
6
7
8
9

使用Django的管理工具manage.py创建数据表Performer和Program,创建数据表前最好先删除001_initial.py文件并清空数据库里的数据表,生成的数据表如下:

在这里插入图片描述

多对多存在与两个或者两个以上数据表中,第一个表的某一行数据可以与第二个表的一道多行数据进行关联,同事第二个表的某一行数据也可以与第一个表的一到多行数据进行关联,如下:
ID 姓名 国籍
1001 王大锤 中国
1002 李光洙 韩国
1003 高晓松 未知
ID 参加节目
1001 万万没想到
1002 Running Man
1003 晓说
1004 英雄联盟
ID 节目ID 演员ID
1 1001 1001
2 1001 1002
3 1002 1001

从上面三个数据表中可以发现,一个演员可以参加多个节目,而一个节目也可以由多个演员共同演出。每个表的字段ID都是唯一的,节目ID和演员ID出现了重复数据,多对多关系需要使用新的数据表来管理两个表的关系。在模型中可以通过ManyToManyField来构建数据表的多对多关系,代码如下:

class Performer(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
nationality = models.CharField(max_length=20)

class Program(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=20)
performer = models.ManyToManyField(Performer)

1
2
3
4
5
6
7
8
9

Django创建多对多关系的时候只需要创建两个数据库对象,在创建数据表的时候会自动生成三个数据表来建立多对多关系,如下:

在这里插入图片描述
3,数据表的读写

前两节主要通过模型来构建目标数据库的数据表,本节主要通过模型操作来实现数据库的读写操作。数据库的读写操作主要是对数据库进行增、删、改、查。数据表index_type和index_product分别在两个数据表中添加如下内容数据。

手动在navicat客户端的mydjango数据库的index_type数据表中加入以下数据:

在这里插入图片描述

为了更改的演示数据库的读写操作,在MyDjango项目中使用shell模式进行演示(该模式主要为方便开发人员和执行脚本)在PyCharm的Terminal下启动shell模式,输入‘python manage.py shell’指令即可开启

在这里插入图片描述

在这里插入图片描述

在shell模式下,如果相对数据表index_product插入数据,输入如下代码:

In [1]: from index.models import
In [2]: p = Product()
In [3]: p.name = ‘荣耀 V9’
In [4]: p.weight = ‘111g’
In [5]: p.size = ‘120757mm’
In [6]: p.type_id = 1
In [7]: p.save()

1
2
3
4
5
6
7

从models.py中导入Product
对模型Product声明并实例化,生成对象P
对对象p的属性进行赋值,对象p的属性来自模型Product所定义的字段
完成赋值,需要对p进行保存

代码执行结束后,可以查看到插入数据的情况:

在这里插入图片描述

除了上述方法外,数据的插入还有以下两种方式:

方法一:(通过Django的ORM框架提供的API实现,使用create方法实现数据插入) Product.objects.create(name=‘荣耀V12’,weight=‘111g’,size=‘120757’,type_id=1)

方法二:(在实例化时直接设置属性值) p = Product(name=‘荣耀V12’,weight=‘111g’,size=‘120757’,type_id=1)

如果想对现有数据进行更新,实现步骤与数据插入大致相同,唯一的区别在模型实例化后,要更新数据,需要先进行依次数据查询,将查询结果以对象形式赋给p,最后对p的属性进行数据的更新,代码如下:

In [1]: p = Product.objects.get(id=5)
In [2]: p.name='华为荣耀V9‘
In [3]: p.save()

1
2
3

七,表单与模型

表单是搜集用户数据信息的各种表单元素的集合。其作用是实现网页上的数据交互,数据在网站上输入数据信息,然后提交但网站服务器上处理。

​ 用户表单是Web开发的一项基本功能,Django表单功能是由Form类实现,主要分为两种:django.forms.Form、django.forms.ModelForm。前者是一个基础的表单功能,后者是在前者基础上结合模型所生成的数据表单。
1,初识表单

传统的表单生成方式是在模板文件中编写HTML代码实现的,在HTML语言中,表单由标签实现。表单生成方式如下:

# 表单 First name:

Last name:


# 表单
1
2
3
4
5
6
7
8
9
10
11
12
13
14

一个完整的表单有四部分构成:提交地址、请求方式、元素空间和提交按钮。说明如下:

提交地址用于设置用户提交的表单数据应由哪个URL接收和处理,由控件的属性action决定。当用户向服务器提交数据时,如果属性action为空,提交的数据应有当前URL来接收和处理,否则网页会跳转到属性action所指向的URL地址。
请求方式用于设置表单提交方式,通常时GET请求或POST请求,由控件的属性method决定。
元素控件时供用户输入数据信息的输入框。由HTML的控件实现,其控件属性type用于设置输入框的类型,常用的输入框类型有文本框、下拉框和复选框。
提交按钮供用户提交数据到服务器,该按钮也是由HTML的控件实现的。但该按钮具有一定的特殊性,因此不归纳到元素控件的范围内。

在模板文件中,直接编写表单时一个较为简单的实现方式,如果表单元素较多,会在无形中增加模板的代码量,这样对日后维护和更新造成极大的不便。为了简化表单的实现过程和提高表单的灵活性,Django提供了完善的表单功能。我们对MyDjango目录做了细微调整,如下:

在这里插入图片描述

在MyDjango的index中添加了而空白文件form.py,该文件主要用于编写表单的实现功能,文件夹可自行命名;同时在文件夹templates中添加模板文件data_form.html,该文件用于将表单数据像是在网页上。form.py、views.py和data_form.html中分别添加如下代码:

form.py代码,定义ProductForm表单对象

from django import forms
from .models import *

表单

class ProductForm(forms.Form):
name = forms.CharField(max_length=20, label=‘名字’,)
weight = forms.CharField(max_length=50, label=‘重量’)
size = forms.CharField(max_length=50, label=‘尺寸’)

设置下拉框的值

choices_list = [(i+1, v[‘type_name’]) for i,v in enumerate(Type.objects.values(‘type_name’))]
type = forms.ChoiceField(choices=choices_list, label=‘产品类型’)

views.py代码,将ProductForm实例化将其传递到模板中生成网页内容

from django.shortcuts import render
from .form import *
def index(request):
product = ProductForm()
return render(request, ‘data_form.html’,locals())

data_form.html代码,将表单对象的内容显示在网页上

Title {% if product.errors %}

数据出错啦,错误信息:{ { product.errors }}.

{% else %} {% csrf_token %} { { product.as_table }}
{ { product.type.type }} {% endif %}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

上述代码显示了Django内置表单功能的使用方法,主要由form.py、view.py和data_form.html共同实现,实现说明如下:

在form.py中定义表单ProduceForm,表单以类的形式表示。在表单中定义不同类型类的属性,这些属性在表单中称为表单字段,每个字段代表HTML里的一个控件,这是表单的基本组成单位。
在views.py中导入form.py所定义的ProductForm类,在视图函数index中ProductForm实例化生成对象product,再将对象product传递给模板data_form.html
模板data_form.html将对象product以HTML的的形式展示在网页上

在这里插入图片描述
2,表单的定义

Django的表单功能主要是通过定义表单类,再由类的实例化生成HTML的表单元素控件,这样,可以在模板中减少HTML的编码,每个HTML的表单元素控件有表达那字段决定,代码如下:

#表单类ProductForm的表单字段name
name = forms.CharField(max_length=20, label=‘名字’,)
#表单字段name所生成的HTML元素控件

1
2
3
4
5
6
7

从表单字段转换HTML元素控件可以发现:

字段name的参数label将转换成HTML的标签
字段name的form.CharField类型转换成HTML的控件,标签是一个输入框控件,type="text"代表当前输入框为文本输入框,参数type用于设置输入框的类型
字段name的命名转换成控件的参数name,表单字段的参数max_length将转换成控件的参数required maxlength。

除了上述表单字段外,Django还提供了多种内置的表单字段

在这里插入图片描述

表单字段除了转换HTML控件外,还有一定的数据格式规范,数据格式规范主要由字段类型和字段参数实现,每个不同类型的表单字段都由一些自己特殊的参数,但每个表单字段都具有共同参数,如下:

required=True #请求不能为空
widget=None #HTML插件
label=None #用于生成lable标签或显示内容
initial=None #初始值
help_text=’’ #帮助信息(在标签旁边显示) error_messages=None #(错误信息{‘required’:‘不能为空’,‘invalid’:‘格式错误’}) show_hidden_initial=False#是否在当前插件后面加一个隐藏的并且有默认值的插件(可用于检验两次输入是否一致)
validators=() #自定义验证规则 localize=False #是否支持本地化 disabled=False #是否可以编辑 label_suffix=None #label内容后缀

1
2
3
4
5
6

我们对form.py的表单ProductForm的字段进行优化,代码如下:

from django import forms
from .models import *
from django.core.exceptions import ValidationError # 自定义数据验证函数 def weight_validate(value):
if not str(value).isdigit():
raise ValidationError(‘请输入正确的重量’) # 表单 】
class ProductForm(forms.Form): # 设置错误信息并设置样式
name = forms.CharField(max_length=20, label=‘名字’, widget=forms.widgets.TextInput(attrs={‘class’: ‘c1’}), error_messages={‘required’: ‘名字不能为空’},) # 使用自定义数据验证函数
weight = forms.CharField(max_length=50, label=‘重量’,
validators=[weight_validate])
size = forms.CharField(max_length=50, label=‘尺寸’) # 获取数据库数据 choices_list = [(i+1, v[‘type_name’]) for i,v in enumerate(Type.objects.values(‘type_name’))] # 设置CSS样式 type = forms.ChoiceField(widget=forms.widgets.Select(attrs={‘class’: ‘type’,‘size’:‘4’}), choices=choices_list,label=‘产品类型’)

1
2
3
4
5
6
7
8
9
10

优化的代码分别使用了widget、label、error_messages和validators,这四个参数是实际开发过程中常用的参数,参数说明如下:

参数widget是一个form.widgets对象,其作用是设置表单字段的CSS央视。widget的对象类型应与表单字段类型相符合,如果字段类型为CharField和widget的对象类型为form.widgets.TextInput,二者的含义与作用是一致的,都代表文本输入框;如果字段类型为ChoiceField和widget的对象类型为form.widgets.TextInput相结合,前者是下拉选择框,后者是文本输入框,那么网页就会优先显示为文本输入框。
参数label会转换成HTML的标签,作用是对控件的描述和命名,使用户理解控件的作用和含义。
参数error_messages用于设置数据验证是被后的错误信息,参数值以字典形式表示,字典的健为表单字段的参数名,字典的值为错误信息。
参数validators用于自定义数据验证函数,当前用户提交表单数据后,首先执行自定义的验证函数,当数据验证失败后,会抛出设置参数error_messages,因为数据验证已由参数validators优先处理。

为了进一步验证优化后的

相关文章