django中手动实现分页功能

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}

1. view实现

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})

2. 模板实现

<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>

附模板中四则运算的实现

Django模版加法:

{{ page|add:1}} page=2,则返回3

Django模版减法:

{{page|add:-1}} page=2,则返回1,这个比较好理解,减法就是加一个负数 

Django模版乘法:

{%  widthratio 5 1 100 %} 上面的代码表示:5/1 *100,返回500,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行乘法的话,就将参数2=1即可 

Django模版除法:

{%  widthratio 10 2 1 %} 上面的代码表示:10/2 *1,返回5,widthratio需要三个参数,它会使用 参数1/参数2*参数3,所以要进行除法的话,就将参数3=1即可 

如有更简单的方法,欢迎评论!

 


Comments(0) Add Your Comment

Not Comment!