Python Day 62 Django框架、Django框架中分页 、 网络攻击

  ##Django内置分页

#1、导入django类生成对象之后的方法
# 内置分页需要导入django中的类
    from django.core.paginator import Paginator
    paginator = Paginator(user_list,10)
    # 第一个参数是我们查出来的所有的对象, 第二个参数表示的是每页显示的行数
    # 生成一个paginator对象 paginator可以点出如下的方法
    # per_page: 每页显示条目的数量(多少行)
    # count:    总数据的个数
    # num_pages: 总页数
    # page_range: 总页数的索引范围,eg: (1,10) 表示第1页到第10页
    # page:      page对象

    users = paginator.page(cur_page)    # 需要把当前页数传进去
    # 生成page对象,page对象有如下的方法
    # has_next              是否有下一页
    # next_page_number      下一页的页码
    # has_previous          是否有上一页
    # previous_page_number  上一页的页码
    # object_list           分页之后的数据列表QuerySet  列表中套对象
    # number                当前页
    # paginator             paginator对象

#2、后端代码(逻辑函数)
def test(request):
    try:
        # 首先我们需要从前端获取到需要指定的当前页数
        cur_page = request.GET.get("cur_page")
        # 转成int类型
        cur_page = int(cur_page)
    except Exception as e:
        cur_page=1
    # 查出所有的对象
    user_list = models.UserInfo.objects.all()
    # 内置分页需要导入django中的类
    from django.core.paginator import Paginator
    paginator = Paginator(user_list,10)

    users = paginator.page(cur_page)    # 需要把当前页数传进去

    # 然后就可以把page对象(users)传到前台进行操作
    return render(requset,"test.html",{"users":users})


#3、前端页面分页处理

{#①先把数据生成#}
<ul>
    {% for user in users.object_list %}
        <li>{{ user.name }}</li>
    {% endfor %}
</ul>

{#上一页   需要判断有没有上一页,有了才跳转#}
{% if users.has_previous %}
    <a href="/test2/?cur_page={{ users.previous_page_number }}">上一页</a>
{% else %}
    <a href="#">上一页</a>
{% endif %}

{#②生成页面编号#}
<li>
{#users(page对象)没有总共多少页的属性,但是(paginator对象有)#}
    {% for num in users.paginator.page_range %}
        <a href="/test2/?cur_page={{ num }}">{{ num }}</a>
    {% endfor %}
</li>
{#③生成上一页与下一页#}
{% if users.has_next %}
    <a href="/test2/?cur_page={{ users.next_page_number }}">下一页</a>
{% else %}
    <a href="#"></a>
{% endif %}

  ##自定义分页

#由于django系统提供的分页功能有限,不能指定显示多少页,也不能定制一些其他东西,
所以我们自定制分页的类
def custom(request):
    cur_page = request.GET.get('cur_page') #获取当前页码数

    #算出总行数
    totle = models.UserInfo.objects.count()
    pageinfo = PageInfo(cur_page,totle) #实例化一个对象



    start=pageinfo.get_start()
    stop = pageinfo.get_stop()
    user_list = models.UserInfo.objects.all()[start:stop]
    return render(request,"custom.html",{"user_list":user_list,"pageinfo":pageinfo})
后端逻辑函数
class PageInfo:
    def __init__(self,cur_page,totle,per_page=10,show_page=11):
        try:
            self.cur_page = int(cur_page) #当前页码数
        except Exception as e:
            self.cur_page = 1
        self.per_page = per_page #每页面显示10条数据
        self.show_page = show_page #每页面展示11页
        # 这里用到内置函数divmod----相当于(a//b,a%b)整除和取模
        # 总行数  /  每页的行数   a 表示正数部分   b表示余数
        a,b =divmod(totle,per_page)
        if b:
            self.total_page = a + 1
        else:
            self.total_page = a
    def get_start(self):
        return (self.cur_page - 1 ) * self.per_page
    def get_stop(self):
        return self.cur_page * self.per_page
    def page(self):
        half = int((self.show_page) /2) #当前页码数的前面展示多少依据

        #总页数小于show_page == 11
        if self.total_page  < self.show_page:
            begin =1
            stop = self.total_page +1
        else:
            #总页数大于show_page == 11
            if self.cur_page -1 < half:  #比较依据原因是当前页码小于half时 出现负数页码
                begin = 1
                stop = self.show_page +1
            elif self.cur_page + half > self.total_page:
                # begin = self.cur_page - half #如果当前页减去half的话,页面上的页码数随之减少,即没有显示固定11页
                begin = self.total_page - self.show_page +1
                stop = self.total_page+1
            else:
                begin =self.cur_page - half
                stop = self.cur_page +half+1
        sli = []
        #添加上一页a标签,判断是否是第一页,第一页的话只能跳转到当前页,不是的话当前页减去1 进行跳转
        if self.cur_page ==1:
            # s = "<a style='dispaly:inline-block;padding:5px;margin:5px' href='#'>上一页</a>"
            s = "<li class='disabled'><a  href='#'>上一页</a></li>"
        else:
            # s = "<a style='dispaly:inline-block;padding:5px;margin:5px' href='/custom/?cur_page=%s'>上一页</a>" %(self.cur_page -1)
            s = "<li><a  href='/custom/?cur_page=%s'>上一页</a></li>" %(self.cur_page -1)
        sli.append(s)

        for num in range(begin,stop):
            if num == self.cur_page:
                # s = "<a style='dispaly:inline-block;padding:5px;margin:5px;backgroud-color:red' href='/custom/?cur_page=%s'>%s</a>"%(num,num)
                s = "<li class='active'><a  href='/custom/?cur_page=%s'>%s</a></li>"%(num,num)
            else:
                # s = "<a style='dispaly:inline-block;padding:5px;margin:5px' href='/custom/?cur_page=%s'>%s</a>" % (num, num)
                s = "<li ><a  href='/custom/?cur_page=%s'>%s</a></li>" % (num, num)
            sli.append(s)
        # 添加下一页a标签,判断是否是最后一页,最后一页只能跳转到当前页,不是的话当前页加上1进行跳转
        if self.cur_page ==self.total_page:
            # s = "<a style='dispaly:inline-block;padding:5px;margin:5px' href='#'>下一页</a>"
            s = "<li class='disabled'><a href='#'>下一页</a></li>"
        else:
            # s = "<a style='dispaly:inline-block;padding:5px;margin:5px' href='/custom/?cur_page=%s'>下一页</a>" %(self.cur_page +1)
            s = "<li><a href='/custom/?cur_page=%s'>下一页</a></li>" %(self.cur_page +1)
        sli.append(s)
        # 页面导航整体返到外面
        page_str =" ".join(sli)
        return page_str
后端分页类
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}

<nav aria-label="Page navigation">
  <ul class="pagination">
      {#需要把这xss改成safe   通过管道符 safe,这样插进来的html字符串才能被浏览器解析#}
    {{ pageinfo.page | safe }}
  </ul>
</nav>
</body>
</html>
前端代码

  ##

猜你喜欢

转载自www.cnblogs.com/liangzhenghong/p/11208843.html