五.3--分页之增加当前页选中、首尾页、上下页实现

之前的页码标签都是在数据测试页面中写循环渲染展示所有页码的:

{% for num in total_num %} -----模版语法中这是循环生成li标签的
  

  • {{ num }}

  • {% endfor %}
    {{ html_str|safe }}    

    那为了调用方便,可把这循环写在views.py函数中循环,但它是生成一个个li的字符串,然后连起来后利用mark_safe往里放就行了.

    html_str = mark_safe(''.join(html_list)) #通过mark_safe方法后,templates模版就能直接渲染html_str字符串

    1.views.py中:

    from django.shortcuts import render,redirect
    from django.contrib import auth
    from crm.forms import RegForm #导入forms.py文件
    from crm.forms import models
    from django.utils.safestring import mark_safe
    def login(request):
    err_msg = ''
    if request.method == "POST":
    username = request.POST.get('username')
    password = request.POST.get('password')
    obj = auth.authenticate(request,username=username,password=password)
    if obj:
    return redirect('/index/')
    err_msg = '用户名或密码错误'
    return render(request,'login.html',{'err_msg':err_msg})

    #注册并提交
    def reg(request):
    form_obj = RegForm() #实例化forms.py中的RegForm类拿到要展示的字段
    if request.method == 'POST':
    form_obj = RegForm(request.POST)#form表单做校验
    if form_obj.is_valid(): #校验成功则
    #则创建新用户
    obj = form_obj.save() #save方法可直接保存你的信息
    obj.set_password(obj.password)#设置密码
    obj.save()
    return redirect('/login/')
    #失败则把错误信息传到前端
    return render(request,'reg.html',{'form_obj':form_obj}) #把实例化对象传到注册页面去渲染

    #展示客户列表
    def customer_list(request):#返回页面
    all_customer = models.Customer.objects.all()#拿到所有的客户
    return render(request,'crm/customer_list.html',{"all_customer":all_customer})#传到前端进行渲染

    users = [{'name':'zhihua{}'.format(i),'pwd':'zh12345{}'.format(i)} for i in range(1,300)]
    def user_list(request):
    try: #为防止别人在地址栏?page=后乱输数字或别的字符,所以做判断并都默认跳到第一页
    current_page = int(request.GET.get('page',1)) #当前的页码,默认拿到的是1
    if current_page <= 0:
    current_page = 1
    except Exception as e: #报错则显示第一页
    current_page =1
    #一次最多显示的页码数
    max_show = 11
    half_show = max_show // 2 #一半的计数

    per_num = 10 # 每页显示的数据条数
    all_count = len(users)# 总数据量
    total_num, more = divmod(all_count, per_num)# 总页码数
    if more:#如果有余数就让总页码数加等1
    total_num += 1

    #总页码数(页面数)小于最大页码显示数11:最多显示页码数为总页码数字
    if total_num <= max_show:
    page_start = 1
    page_end = total_num
    else:
    # 总页码数(页面数)大于最大页码显示数11:最多显示11个页码
    if current_page <= half_show: #当前页面页码数字小于5则展示1到11个页码
    page_start = 1
    page_end = max_show
    elif current_page + half_show >= total_num:#当前页码加5大于总页面数(总页码)
    page_end = total_num #总页面数(总页码)
    page_start = total_num - max_show + 1 #起始页码是总页码减11加1
    else:
    page_start = current_page - half_show
    page_end = current_page + half_show


    # 存放li标签的列表
    html_list = []

    #加首页
    first_li = '
  • 首页
  • '
    #---点击首页是默认跳到第一页
    html_list.append(first_li)

    # 加上一页
    if current_page == 1:

    prev_li = '
  • <<
  • '
    #则<<<这个li标签失效
    else:

    prev_li = '
  • <<
  • '
    .format(current_page - 1)

    html_list.append(prev_li)
    for num in range(page_start, page_end + 1):#for 循环拿到起始到终止页码的页码数
    if current_page == num:#如果当前页即地址栏中page=几是等于拿到的页码数就选中状态
    li_html = '
  • {0}
  • '
    .format(num)

    else:
    li_html = '
  • {0}
  • '
    .format(num)

    html_list.append(li_html)
    # 加下一页
    if current_page == total_num:

    next_li = '
  • >>
  • '
    else:

    next_li = '
  • >>
  • '
    .format(current_page + 1)

    html_list.append(next_li)
    # 加尾页
    last_li = '
  • 尾页
  • '
    .format(total_num)

    html_list.append(last_li)
    html_str = mark_safe(''.join(html_list)) #通过mark_safe方法后,templates模版就能直接渲染html_str字符串


    #切片的起始值
    start = (current_page - 1)* per_num
    #切片的终止值
    end = current_page * per_num

    return render(request, 'user_list.html',
    {
    "data": users[start:end],
    'html_str': html_str

    })

     

    2.在user_list.html中:

    {% extends 'layout.html' %}
    {% block content %}
    <table class="table table-bordered">
    <thead>
    <tr>
    <th>序号th>
    <th>用户名th>
    <th>密码th>
    tr>
    thead>
    <tbody>
    {% for user in data %}
    <tr>
    <td>{{ forloop.counter }}td>
    <td>{{ user.name }}td>
    <td>{{ user.pwd }}td>
    tr>
    {% endfor %}
    tbody>
    table>
    <nav aria-label="Page navigation">
    <ul class="pagination">
    {{ html_str }}
    ul>
    nav>
    {% endblock %}

    3.效果如下:

    五.3--分页之增加当前页选中、首尾页、上下页实现_第1张图片

    #for 循环拿到起始到终止页码的页码数

    你可能感兴趣的:(五.3--分页之增加当前页选中、首尾页、上下页实现)