之前的页码标签都是在数据测试页面中写循环渲染展示所有页码的:
{% for num in total_num %} -----模版语法中这是循环生成li标签的
{% 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.效果如下:
#for 循环拿到起始到终止页码的页码数