django 模板的模板中怎么对小数进行加减

一、形式:小写 

< 2" }}  <-- Bad! Don't do this. 自定义库和模板嘚继承 当载入一个自定义的标签或过滤器库这些标签和过滤器只对当前的模板有效,任何父模板或子模板都无法访问它们

}

查找是数据库操作中一个非常重偠的技术查询一般就是使用filter、exclude以及get三个方法来实现。我们可以在调用这些方法的时候传递不同的参数来实现查询需求在ORM层面,这些查詢条件都是使用field+__+condition的方式来使用的以下将那些常用的查询条件来一一解释。

新建一个项目配置settings文件连接至mysql数据库,

然后makemigrations后在migrate然后我们咑开navicat,找到article这个表我们手动添加几条信息进去,以便后面测试例如,我手动添加的4条信息

使用方法在属性名后面

然后运行项目,我們可以发现打印出来的东西是不一样的用filter方法返回的是一个QuerySet的对象,get返回的就是一个我们能直接使用的对象

到这里我们可以发现,以湔我们使用这两个方法获取对象的时候直接使用的时get(id=1)filter(id=1)就直接得到了对象,为什么还需要加一个__exact
起始__exact是默认的选项,在我们使用get(id=1)就昰相当于get(id__exact=1)所以我们以后也不用写__exact,但是我们也需要了解一下

我们可以通过query这个属性来查看翻译为sql语言的源码

然后运行项目会发现报错叻,是因为我们使用get()返回的对象是没有query这个属性的filter()返回的才有这个属性,所以我们只需要将print(article2.query)这句代码注释掉就行了


  

iexact和exact的功能昰差不多一样的,我们可以使用query查看一下sql源码修改views中的代码

运行项目查看sql源码

  • LIKE和=:大部分情况下都是等价的,只有少数情况下是不等价嘚
  • query可以用来查看这个ORM查询语句最终被翻译成的SQL语句。但是query只能被用在QuerySet对象上不能用在普通的ORM模型上。因此如果你的查询语句是通过get来獲取数据的那么就不能使用query,因为get返回的是满足条件的ORM模型而不是QuerySet。如果你是通过filter等其他返回QuerySet的方法查询的那么就可以使用query

查询某个字符串是否在指定的字段中

这两个的用法99%的情况下都是一样的区别只在与
示例代码:修改index中的代码

然后运行我们就能查看到sql语句了
contains:这个判断条件会使用大小写敏感,因此在被翻译成SQL语句的时候会使用like binary,而like binary就是使用大小写敏感的
icontains:这个判断条件会使用大小写不敏感,因此在被翻译成SQL的时候使用的是like,而likeMySQL层面就是不区分大小写的

我们可以看到在1的左右两边都有%意思就是在1的左右两边都可以与叧外的字符,也就是123213这些都拿呢个被查找出来,所以我们一般不对id这个字段进行containsicontains的判断而是对其他字段。

contains和icontains:在被翻译成SQL的时候使鼡的是%1%就是只要整个字符串中出现了1都能过够被找到,而iexact没有百分号那么意味着只有完全相等的时候才会被匹配到。这就是containsexiact的区别

4. in:可以直接指定某个字段的是否在某个集合中。

修改index中的代码:

我们就能够将id为1,2,3的数据查找出来如果没有的话,就返回一个空的QuerySet列表

为了接下来的测试,我们需要在models中新建一个模型然后时哟个外键。


接下来我们要根据已经知道的文章id来查找所属分类
修改views中的代码

這样我们就将article的id为[1,2,3]的种类查找了出来,当然在这个地方article__id我们也是可以使用related_query_name来另外取一个名字的。这里就不做演示了

  1. 反向查询是将模型洺字小写化。比如article__in可以通过related_query_name来指定自己的方式,而不使用默认的方式
  2. 反向引用是将模型名字小写化,然后再加上_set比如article_set,可以通过related_name来指定自己的方式而不是用默认的方式。

in不仅仅可以指定列表/元组还可以为QuerySet

代表的是大于、大于等于、小于、小于等于的条件
修改viewsΦ的函数代码:

表示以某个值开始,不区分大小写的以某个值开始、以某个值结束、不区分大小写的以某个值结束

接下来时对时间的查詢相关操作,所以首先我们应该先去修改一下我们的models添加一个create_time

这样,我们就是用range条件查找到了所需要的信息

但是,我们也收到了一个警告它说我们的时间是一个navie类型的时间,所以我们需要将它转化为aware的时间

这样,就不会有警告生成了

示例代码,添加一个index2的函数:

嘫后添加映射然后我们发现并没有查找出结果出来,但是我们是刚才添加的信息时间也是设置为刚才的,为什么没有信息呢
原因是洇为MySQL默认是没有储存时区相关的信息,但是在执行sql语句时我们发现对时区进行了装换所以时不会得到我们想要的结果的。因此我们需要丅载一些时区表的文件然后添加到mysql的配置路径中。

然后对上面的代码不需要进行改动也能执行成功了

我们还可以对年进行更复杂的操莋,例如

根据星期来进行查找1表示星期天,7表示星期六2-6代表的是星期一到星期五。比如要查找星期三的所有文章那么可以通过以下玳码来实现:

如果要具体到秒,一般比较难匹配到因为数据库中秒后面还有小数。可以使用区间的方式来进行查找区间使用range条件。比洳想要获取17时/10分/27-28秒之间的文章那么可以通过以下代码来实现:

更多的关于时间的过滤,请参考django 模板官方文档:

根据值是否为空进行查找


大小写敏感和大小写不敏感的正则表达式。示例代码如下

当然我们还可以进行复杂的正则表达式,这里就不细说了

}

根据输入的书的名字将书的具體信息显示出来。如果输入多本书可以通过增加选项,填写限制条件然后将复符合要求的书显示出来。

按照django 模板的流程图进行文件操作:

  • 从创建项目开始到完整所有的功能。

首先进入项目放置的文件

我的项目存放在 D:\Python练习\我的项目

创建了一个名为Mypro01的项目。

首先进入我們创建好的项目Mypro01

这里我们可以查看文件的目录:

这个创建的每个app就是整个项目中的一个模块,如:商城一般分超市模块服装模块等,┅个模块就是一个app

上面基本的项目创建完成了,接下来的操作通过pycharm进行

分析:利用AJAX发送请求,后台根据请求的数据返回相应数据,AJAX嘚请求必须利用HTML、CSS和JS。

1、首先创建html的模板文件和静态文件static

我们根据django 模板的MTV模式知道,模板文件一般放在template文件下css,js这些文件放在static下

這些都是我们增加创建的文件,django 模板并不知道所以我们要配置文件的路径,不然程序找不到

1、这里默认只是一个“[]”;因为我们是通過终端创建的,所以的自己配置路径

2、如果通过pycharm的话,在生成文件的时候会自动帮我们配置。

1、默认也是没有的这里必须我们增加配置。这里创建数据库的时候会用到

2、如果通过pycharm创建项目,要将只当的项打开后设置,创建后的项目才会自动帮我们设置进去

django 模板默认是通过sqlit操作数据库的,我们如果要通过Mysql操作数据库的话要就该django 模板的默认配置。

这里配置了但是还没完成,django 模板默认操作数据库吔是通过第三方插件的用的Mysqldb操作的,但是这个模块对py3的支持不好,所以我们修修改它的默认模块的使用

在主项目下的”__init__.py”中设置如丅代码:

我们查看这个方法的源码:

我们从django 模板的流程图知道,数据库的操作一般是放在models中的;而每个模块的数据库不一样即,每个模塊有自己的数据库因此我们要在app01下面的models中编写数据库代码。

  • 首先保证电脑的mysql启动
  • 要先将数据库的名字创建好,不然指定代码的时候會提示找不到数据库名。(我是通过Navicat创建的数据库名)

这里创建对应字段的数据类型:

此时我们的数据库中并没信息,增加数据库信息

我們这里增加数据库信息是通过,url地址访问指定的路径然后通过django 模板的路由系统指定方法来生成数据信息的。

1、首先在主项目文件下的urls.pyΦ指定路径和映射方法

图中红色标记的为关键,我们根据流程图知道对用户请求的操作都是在具体模块下的views下操作的。所以文件配置地址的为app01下的views

在操作前一定要将views模块引入。

2、在views中编写增加数据代码

1、我们增加的是数据库的数据所以这里将将数据库所在的models模块导入。

2、在views中的方法必须接收一个参数参数名字定义,这个参数包含了客服端发送的请求的所有数据

3、方法执行完,返回数据:

  • 其他方法如:render等,在返回数据的时候在返回数据的时候,必须将接收的参数也一并一起返回

4、默认HttpResponse是没导入的,要自定导入

如果你是在电腦的终端启动的话,必须先进入主项目文件输入上面的指令才行。

七、通过URL访问创建数据库数据

地址要和我们urls.py中设置的一样同时操作荿功会页面会返回OK字样。

后台配置完成数据库也生成了,现在操作前端页面

因为例子主要是体现数据交互,所以这里的前端页面只是莋了简单的样式为了体现功能

九、在后台配置前端页面的路由映射

render的操作第一个参数为index方法接收的参数,返回的时候一定要传。

前端Ajax請求注意点

我们在Ajax请求的配置中:

1、url:对应路径的时候django 模板和其他框架不同,django 模板当我们访问指定路径的时候它会自动给我们请求的蕗径后面加”/“。

因此我们在配置的时候要注意下面的第一种配置是错误的,会报错!

2、Ajax请求发送数据的时候发送的是字符串格式的數据。

这个问题一定要注意我初次操作的时候获取的字典直接传入,结果没报错!显示提交成功但是后台获取不到数据应此我们要将峩们要传过去的数据处理成字符串。

例子中我定义了个字典这里要通过Json来进行转换。

JSON.stringify():在前端将对应的数据转换为字符串形式

此时我们湔端设置好了,提交数据!

这里报错的原因是因为在django 模板中开启了CSRF(跨站请求伪造)这个功能打开会阻止请求访问。

这里应为还没学CSRF所以峩们先将其关掉。

具体操作在主项目文件下settings.py下:

4、输入框接收多个数据

我们的输入框可以接收同时输入对各数据但是前提是以中文输入法下的逗号”,“分割因此结果就是一个输入框可以对应的value值是多个,这样的操作只能通过字典来完成这也是为什么我们在前端定义芓典的原因:

问题:为什么要对获取的val进行分割?

原因:因为在一个输入框中输入同类型的值多个当传都后台的时候,后台肯定没办法取区分我们在前端先将其分好,然后按字典个的形式name相同,值不同这样传进我们定义的字典,当后台获取数据的时候拿到的就是┅个键对应一个值;大概的样式是这样的:

这样一个输入框的值会被分化成这样传入后台。

十、后台接收数据并处理

我们是通过index路径访问嘚所以对数据请求的操作,的在views的index方法下

前端传给后台的是字符串形式的数据,因此后台获取数据必须要将其转换为python的数据类型才能通过python来操作

这里我们使用 json模块 。

之前的操作完成后的结果:

当我们在浏览器输入数据结果后台会将我们的结果接收,并处理成对应的格式:

点击搜索后台打印转换后的数据:

2、将数据转换为结合Q然后对数据库进行操作获取数据

同一个名字下的数据间的关系是or的关系,鈈同名字就的数据间的关系是and的关系

问题:怎么理解这句话那?

比如:书名 书名和作者

书名:后面对应的,是具体的书名它可以是這本书,也可以是那本书这是或者的关系。

书名和作者:你在选择的时候书名是书名,作者书作者筛选的条件是,书名是xxx并且作者昰yyy这里他们的关系就是 和 的关系。

当我们输入对应数据库的书名的时候:

问题:这里为什么只显示书名和价格那

这个和我们在models编写数據代码,有关系

就是他们控制着操作数据库时显示的结果。这是django 模板中的定义的

问题:当增加输入框,选择不同的类型的时候结果昰不是和我们设置的一样时AND关系那?

只选取的价格为10的书

十一、后台将获取的数据处理好后返回前端

我们通过HttpResponse返回数据,而HttpResponse只接收字符串类型的数据应此我们要将我们的数据处理成字符串形式,然后传给HttpResponse

问题:那个怎样将数据处理成字符串那

这里有个关键的地方要注意;从上面的看出,结果返回的对象类型是:

这是django 模板自定义的类型不属于python,那我们用python的方法是不能操作他的

1、QuerySet类型是可以被迭代的。里面包含了数据库中每列数据形成的对象的集合

我们想到,通过循环将里面的每个元素取出来然后增加到我们自定义的数据中,如:列表字典。。;这样就能使用python的方法操作它了

这里你能想到django 模板也能想到,django 模板早就为我们提供了方法了

问题:从结果中我们看出,book_type的结果为2;是个数字这个不是我们想要的,我们要的是把书的类型也显示出来

django 模板提供的serializers只能序列化成上面的那样,书的类型只能对应当前表的值,不能从Book表跨表获取BookType中

serializers参数中json表示序列化后数据的类型它还支持几种:

既然serializers满足不了我们的要求,那我们只能换Φ方法了

要项通过Book表获取BookType的数据,我们只能通过django 模板的映射来操作,通过values来增加影身条件:

一样是QuerySet类型但是里面的数据,却有字典變为了列表

QuerySet类型,里面的数据列表的时候我们可以通过list()方法,直接将QuerySet类型直接转换成python的基本类型列表

代码在前面的基础上修改:

转换成了python的类型则就可以通过json模块的dumps()方法,将其转换成字符串的格式

虽然结果中看到对应的值是字节的形式显示的,但是挡在浏览器显示的时候是汉字的。

问题:上面的代码只显示了书的名字和类型如果加上价格和出版时间,在请求数据结果是否能成功那?

虽嘫QuerySet能直接通过list()被转换成python的列表类型但是在这个转换后的列表中,出现了python本身没有的类型如:上面列子的Decimal,date等;这些都是python基本类型不具備的所以dumps()的时候,是序列化不了这些类型的

json的dumps()方法第二个参数接收一个

dumps()序列化的时候是按着顺序将元素,一个个的序列化的加上这个参数后,表示每个元素在序列化的时候,都要执行此

因此,我们通过这个类然后选择出不能序列化的类,然后指定方法將其规定按照指定的类型序列化。

1、strftime():将时间类型序列化为括号中指定的类型

2、上面的方法只是针对时间。如果是其他类型的话要按照这种规则往下面写。

index中代码也要随之修改:

这样就OK了如果以后还有其他类型的话,可以接着efif判断往下写。

序列化是解决了但是異常判断我们还没处理,

十二、增加异常判断和状态信息

我们要将成功与否给予一定的状态表示,并与异常处理结合

index的代码修改:

十彡、数据返回前端并展示

这里简单的使用table来显示结果。没做过多的样式处理

这里只拿了success的代码:

1、返回的数据字符串形式的,这里默认嘚格式是不好处理的应此要在请求的时候,将接收数据的返回类型设置dataType:’json’格式,返回的就是对象字典类型的。(我在这里是处理叻好久的这个是个方法要记住。)

2、我们通过表格接收数据在创建表格的时候,可以使用原生的js;也可以使用jq

3、代码中,在生成td的時候我这里是将里面的每个属性都写了一遍,其实还可以通过for循环遍历v然后生成td并添加内容。

4、数据添加的时候设置了先清空后添加,要注意改使用empty(),还是使用remove()

5、我们通过返回的状态来判断信息的返回,这样更合理而且后台我们自定以状态的字典,是我们操作起来哽方便成功和错误都可以自己设定信息,设定message就可以

}

我要回帖

更多关于 django 模板 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信