2024年4月23日 11:26 by wst
django之前有块显示所有用户反馈的功能,是列表显示的,结果全堆在那里,鼠标往下滚很久才能到底;
于是想着做个分页,由于数据库用的不是本项目的,所以只能手动实现分页。
前端采用最简单的方式,显示上一页按钮、当前页、下一页按钮、总页数。
在渲染模板的时候,需要传递如下数据(当前页数据data, 总页数page_count, 当前页码page):
# 上一页通过page-1实现,下一页通过page+1实现
{"data": data, "page_count": page_count, "cur_page": page}
def plhd_contacts(request):
""" 普力海达联系人信息 """
if not request.session.get('is_login', None):
return redirect('/authen/login?next={}'.format(request.path))
print("para:", request.GET)
page_size = int(request.GET.get("pageSize", 10))
page = int(request.GET.get("page", 1))
if page < 1:
page = 1
conn = pymysql.connect(**PLHD_DBKWARGS)
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
tb = "contacts"
# 获取总页数
cur.execute(f"select count(1) as total from {tb};")
res = cur.fetchone()
total = res['total']
page_count = int(total/page_size)
sql = f"select * from {tb} order by create_time desc limit {(page-1)*page_size}, {page_size};"
cur.execute(sql)
data = cur.fetchall()
return render(request, "tools/plhd_contact.html", context={"data": data, "page_count": page_count, "cur_page": page})
<div id="collapseOne" class="w-100 show" aria-labelledby="headingOne"
data-parent="#accordionExample">
<div class="card-body w-100">
<h2>提交信息的联系人</h2>
{% if data|length %}
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>序号</th>
{% for key in data.0 %}
<th>{{key}}</th>
{% endfor %}
</tr>
</thead>
{% for contact in data %}
<tr>
<td>{{ forloop.counter }}</td>
{% for key,value in contact.items %}
<td>{{ value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<div>
<a href="/tools/plhd_contacts?pageSize=10&page={{cur_page|add:-1}}">上一页</a>
<span>当前页{{cur_page}}</span>
<a href="/tools/plhd_contacts?pageSize=10&page={{cur_page|add:+1}}">下一页</a>
<span>总页数:{{page_count}}</span>
</div>
</div>
{% else %}
<p>暂无数据</p>
{% endif %}
</div>
</div>
</div>
{{ page|add:1}} page=2,则返回3
{{page|add:-1}} page=2,则返回1,这个比较好理解,减法就是加一个负数
{% widthratio 5 1 100 %} 上面的代码表示:5/1 *100,返回500,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行乘法的话,就将参数2=1即可
{% widthratio 10 2 1 %} 上面的代码表示:10/2 *1,返回5,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行除法的话,就将参数3=1即可
如有更简单的方法,欢迎评论!