html 分页_Python编程(二十九+):Django基础(自定义分页、cookie基础、装饰器装饰函数或类)...

(继续上一篇博文内容)

六、 自定义分页

首先在 michael_03usls.py 文件添加下面这个 URL:path('user_list/', views.user_list),
其次在 app01views.py 文件中写 user_list 函数,代码如下所示:

LIST 

在 templates 目录下创建2个 HTML 文件,li.html, user_list.html。
li.html 文件的代码是下面这一行:<li>{{ item }}</li>
user_list.html 文件的代码是:

<

此时在浏览器地址栏输入 http://127.0.0.1:8000/user_list/?p=1 时,页面上显示 数字 0 到 9,当 p=2时,显示10到19,依此类推。这样每次让用户改变浏览器地址栏上的 p 的值来分页比较麻烦。修改 user_list.html 文件的代码,让其下面显示页码,当点击相应的页码时,就显示对应的数字。
user_list.html 文件修改后的代码是:

<

在上面这段代码中,div 标签内的代码可以直接在后端写好传到前端来,这时 app01views.py 文件中的 user_list 函数的代码如下所示:

LIST 

这时再次修改 user_list.html 文件的代码,如下所示:

<

要注意这段代码中的 {{ page_str | safe }} 语句,如果不加 safe 的话,后端传过来的 page_str 到前端只认为是字符串,加上 safe 时传过来的字符串可解析成 HTML代码,前端认为这是段安全的代码。在处理这段安全的代码时,也可以在后端进行处理。
再一次修改 app01views.py 中的 user_list 函数代码如下:

LIST 

在这次的修改中主要导入了 mark_safe 模块,在给render传递参数前先将参数 mark_safe 转为安全代码,在前端同样可以解析成 HTML代码,此时 user_list.html 中的 div 标签内的代码修改为 {{ page_str }} 即可,页面照样能正常运行。这也叫作是 XSS攻击。
现在小结如下:
XSS的两种方式:前端使用方式:{{ page_str | safe }}
后端使用方式:mark_safe(page_st
r)
上面的代码在每一页显示10条记录,然而总共有100条,为了让这100条记录都能分页显示,需要在后端的 views.py 模块中的 user_list 函数中作相应的处理。修改后的代码如下所示:

LIST 

在 user_list 函数中,for 循环中的 if 判断语句让当前点击的页码高亮显示,其中的 a 标签的 class 属性根据当前点击的页码选择不同的样式进行渲染,以达到这个目的。对应的 user_list.html 的代码如下所示:

<

这样虽然可以在页面上显示页码,但如果记录的数据很多的时候,就不能让页码一次性全部显示了,当数据很多的时候,让其页面上只显示10页。基于这种想法,大致分析如下:当前页:current_page
总页数:count
每页显示10条数据:per_page_count
页码:假设11页
伪代码:

如果:总页数 

还可以在分页时显示上一页、下一页,或者输入某一页进行跳转等。这时需要做比较多的 if else 条件判断来完成这些功能。详细代码如下所示:app01views.py 文件中的 user_list 函数代码:

LIST 

此时在页面上的显示效果如下图1-1所示。

885e385cc1017493a9929b45a6388374.png
图1-1 分页显示效果图

七、 自定义分页二

上面实现这个分页功能的代码比较长,可将一些分页功能封装在类里面,在函数中调用类中的相应方法即可实现这些功能。现在在 app01views.py 文件定义一个类 Page来实现这些功能。如果将这个类的代码写在 views.py 文件的话,会造成该文件的代码很长,可另外创建一个文件夹,将该 Page 类导入进来即可。
在项目文件夹 michael_03 目录下创建 utils 文件夹,在该文件夹下创建 pagination.py 文件,该文件中的 Page 类代码如下:
位置:michael_03utilspagination.py

class 

此时在 app01views.py 文件中的 user_list 函数的代码如下所示:

from 

这样也实现的分页的功能,但是在 views.py 文件中的代码简洁了很多。

八、 cookie基础

cookie 是每个页面都会用到的,与平时访问的网站息息相关。不用cookie的话,所有涉及到登录验证的网站都不能运行。例如在浏览器上设置禁用 cookie 后,所有需要登录的网站都不能登录成功,所以 cookie 是非常重要的。cookie 可理解为:客户端浏览器上的一个文件,类似于一个字典,如{'k':'abcdefg'},保存到浏览器上。这个 cookie 与服务器端没有关系。登录某个网站后,浏览器带着这个 cookie 访问相应的网站,这个网站获取浏览器上保存的 cookie,对用户是否登录进行验证。为了进一步说明 cookie,先做如下步骤的设置。
首先,在 michael_03urls.py 文件中的 urlpatterns 列表添加下面两个URL:path('login/', views.login),
path('index/', views.index),

其次,在templates目录下创建两个 HTML 文件 login.html 和 index.html 文件。这两个文件的代码如下:
templateslogin.html 代码如下:

<

templatesindex.html 代码如下:

<

接下来在 app01views.py 文件中增加两个函数 login() 和 index() ,这两上函数代码如下所示:

user_info 

现在在浏览器地址栏输入 http://127.0.0.1:8000/index/ 会自动跳转到 http://127.0.0.1:8000/login/ 的登录页面。当输入错误的用户名和密码时,仍然会跳转到登录页面。当输入正确的用户名和密码时,就跳转到 http://127.0.0.1:8000/index/ 页面。在登录成功后的页面上的检查下的 Network 选项卡中,可以看到在后台设置的 cookie 信息。如图1-2所示。

a29d0831229984c389e53ec9d3ca5bd8.png
图1-2 cookie信息查看

设置cookie的参数有下面这些:

key

关于 cookie 设置的参数详细说明如下:

def 

九、 cookie应用:cookie实现定制显示数据条数

cookie在服务器端能读也能写,在客户端也是能读也能写的。可以在前端根据用户选择的数目设置一个 cookie 值,后台获取这个cookie 值设置要在页面显示的数目。这里需要引入 jquery,以及一个 jquery的 jquery cookie插件。这个 jquery cookie 插件在前面设置 cookie 非常简单。修改后的 user_list.html 文件代码如下所示:

<

修改后的 user_list 函数代码如下:

from 

十、 装饰器(FBV装饰器、CBV装饰器)

Django中的装饰器有 FBV 装饰器,即函数装饰器。还有 CBV 装饰器,即类装饰器。现在使用函数装饰器给前面写的 index() 函数写一个装饰器函数 auth(),该装饰器主要作用是用户名验证判断,对应的 index() 函数中的判断就可以去掉。详细代码如下所示:

def 

这样当有多个页面需要认证时,使用 auth 函数装饰即可。
类装饰器(CBV装饰器):Django 有提供类装饰器,是 django.utils.decorators 模块中 method_decorator方法,这个方法需要传递的参数是函数名,要装饰类中的哪个方法,直接在对应的方法前面加上 @method_decorator(auth) 即可,这里 auth 是前面已经定义的函数。另外在定义类的时候,还要继承 django 模块中的 views.View 才行。详细代码如下所示:

from 

在上面这段代码中,使用 @method_decorator(auth) 装饰器,参数是 auth 函数来装饰类 Order 中的 get() 方法。此时还需要在urls.py 文件中添加下面这个 URL 对应关系:path('order/', views.Order.as_view()),
此时访问 http://127.0.0.1:8000/order/ 页面,能正常定位到 http://127.0.0.1:8000/login/ 的登录页面。使用正常的用户名和密码能完成登录操作。
上面在类中使用的装饰器,只对类中的一个 get() 方法进行了装饰,假如类中有很多方法都需要装饰的话,就需要在类中的每个方法前面使用 @method_decorator(auth),这样做起来未免有些麻烦。Django 还提供了一种简单的方法,可以一次性把类中定义的方法都进行装饰,详细代码如下所示:

from 

在这段代码中,在类 Order 中定义了 dispatch() 方法,在该方法前使用装饰器 @method_decorator(auth),这样就能对类中所有的方法都进行装饰。这里要注意 dispatch() 方法返回的方法中的参数传递。还有更简单的装饰方法,就是在类 Order 前面使用装饰器 @method_decorator(auth, name="dispatch"),完整代码如下所示:

from 

在类前面使用 @method_decorator(auth, name="dispatch") 装饰器方法,程序代码照样能正常运行。

实验:
主机管理:
操作:
1、 单表操作
2、 一对多操作
3、 多对多操作
要求:
1、 删除,有对话框
2、 修改,添加在新URL中完成
3、 基于 cookie 进行用户认证,必须要用装饰器
4、 cookie实现定制显示个数
5、 页面要有分页功能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值