django数据库版分页实现

说到分页,我头大了一天,但是,最后还是克服了!!

我这里是使用了数据库存储,data(第n页显示数据条,包括前面的页码),page(页码)

每次点击分页按钮,发送一次请求,数据库的data、page都会改变。

now!look here!!!!

1、首先建路由、视图函数、和视图页面、定义模型

(1)视图模板

(2)路由

(3)views.py

 

(4)models.py

class Other(models.Model):
    data = models.IntegerField(verbose_name='变量')
    page = models.IntegerField(verbose_name='页数')

 (5)在数据库上添加一条数据

(6)在show_list.html上添加分页html

点击一个按钮,发送一次post请求,当前页数是不可点击的,只能显示

<div class="footer">
            {# data{{ data }}#}
            <form method="post" action="/stu/list/?paging=pr" class="last_disable">
                {% csrf_token %}
                <input type="submit" name="pr" value="<<" class="btn">
            </form>

            <form method="post" action="/stu/list/?paging=first">
                {% csrf_token %}
                <input type="submit" name="first" value="1" class="btn last">
            </form>...

            {# 当前页数 #}
            <span class="btn current" style="background:#5596e4;">{{ page }}</span>...

            <form method="post" action="/stu/list/?paging=end">
                {% csrf_token %}
                <input type="submit" name="end" value="{{ end }}" class="btn next">
            </form>

            <form method="post" action="/stu/list/?paging=nx" class="next_disable">
                {% csrf_token %}
                <input type="submit" name="nx" value=">>" class="btn">
            </form>
        </div>

 (7)css模板

相对定位,放在你需要的盒子里面

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

li {
    list-style: none;
}

a {
    text-decoration: none;
    color: #bdbdbd;
}


/* 去掉input点击后边框颜色 */

input {
    outline: none;
}


/* 去掉input,type为number时的上下箭头 */

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    -webkit-appearance: none;
}

form {
    display: inline;
}

input[type=submit] {
    padding: 8px 20px;
    background-color: #5596e4;
    border: 0;
    font-size: 13px;
    border-radius: 10px;
    color: #fff;
    cursor: pointer;
}

.footer {
    position: absolute;
    /* 这里位置由你来定义 */
    bottom: 30px;
    /* 这里是,盒子以左边的走了定义相对定位的父亲的百分之50,
所以它要退回百分之50自身的长度,才能居中 */
    left: 50%;
    transform: translate(-50%);
}

.footer .btn {
    margin: 0 10px;
    padding: 15px;
    border: 0;
    box-shadow: 2px 2px 9px -1px rgb(0 0 0 / 20%);
    color: #ffffff;
    border-radius: 10px;
}

  (8)js模板

这里,我用了jq,判断,当前页如果和第一页相同,就隐藏上一页按钮

如果不同就都显示,当前页如果和最后一页相同,就隐藏下一页按钮

$(function (){
    // << >> 隐藏显示
    if ($(".current").html() === $(".last").val() && $(".current").html() === $(".next").val()) {
        $(".last_disable").hide()
        $(".next_disable").hide()
    } else if ($(".current").html() === $(".last").val() && $(".current").html() !== $(".next").val()) {
        $(".last_disable").hide()
        $(".next_disable").show()
    } else if ($(".current").html() !== $(".last").val() && $(".current").html() === $(".next").val()) {
        $(".last_disable").show()
        $(".next_disable").hide()
    } else {
        $(".last_disable").show()
        $(".next_disable").show()
    }
})

(9)页面效果

 2、视图函数的编写

# 引入Other模型
from student.models import StudentInfo, DelStuInfo, Other
data_list = StudentInfo.objects.all()[0:10] 查【第一条到第十条之间的数据】
  • 每次刷新【GET请求】,data、page更新回最初的 第一页10数据 ,page回到第一页的页码
  • 后面,每次点击下一页,data+10,page+1 ,这里查询【data-10:data】,即第一页的【0:10】,点下一页查询【10:20】,由于数据库data=10,点击下一页data=20,更新数据库上传data=20,所以查询【data-10:data】
  • 每次点击上一页,data-10,page-1,这里查询【data-10:data】,即第二页的【10:20】,点击上一页查询【0:10】,由于数据库里面的data=20了,点击上一页data=10,更新数据库上传data=20,所以查询【data-10:data】
  • 每次点击第一页时,更新数据库的 data =10,page = 1,查询用【0:10】
  • 每次点击最后一页时,更新数据库data=end*10,即最后一页*10为最后一页展示的数据在数据库的位置,这里的page=end最后一页,查询【end*10-10:end*10】区间,比如最后一页end=3,就查询【20:30】的数据
# 存储学生页面
def show_list(request):
    # 计算存储数据和 计算最后一页页面
    count = StudentInfo.objects.all().count()

    # 当count=10 、 20 、30。。时,计算最后一页,10/10+1就等于2了,这个bug
    # 所以当count=10。。。, 进行count - 1,int(count/10)+1 = 1,这样最后一页计算就对了
    for i in range(0, 1001, 10):
        if count == i:
            count = count - 1


    end = int(count / 10) + 1

    # 获取数据库上的变量和页数,显示数据条和初始页数
    sql = Other.objects.filter(id=1).first()
    sqldata = sql.data
    sqlpage = sql.page

    if request.method == "GET":
   
        data_list = StudentInfo.objects.all()[0:10]
        Other.objects.filter(id=1).update(data=10, page=1)
        return render(request, 'show_list.html', {'data_list': data_list, 'count': count, 'page': 1, 'end': end})


    paging = request.GET.get("paging")

    if paging == 'nx':
        if sqldata != end*10:
            sqldata = sqldata + 10
            data_list = StudentInfo.objects.all()[sqldata - 10:sqldata]
            sqlpage = sqlpage + 1
            Other.objects.filter(id=1).update(data=sqldata, page=sqlpage)
            return render(request, 'show_list.html',
                          {'data_list': data_list, 'count': count, 'page': sqlpage, 'end': end, 'data': sqldata})
        else:
            data_list = StudentInfo.objects.all()[end * 10 - 10:end * 10]
            return render(request, 'show_list.html', {'data_list': data_list, 'count': count, 'page': end, 'end': end})
    elif paging == 'pr':
        if sqldata != 10:
            sqldata = sqldata - 10
            data_list = StudentInfo.objects.all()[sqldata - 10:sqldata]
            sqlpage = sqlpage - 1
            Other.objects.filter(id=1).update(data=sqldata, page=sqlpage)
            return render(request, 'show_list.html',
                      {'data_list': data_list, 'count': count, 'page': sqlpage, 'end': end, 'data': sqldata})
        else:
            data_list = StudentInfo.objects.all()[0:10]
            return render(request, 'show_list.html', {'data_list': data_list, 'count': count, 'page': sqlpage, 'end': end, 'data': sqldata})
    elif paging == 'first':
        Other.objects.filter(id=1).update(data=10, page=1)
        data_list = StudentInfo.objects.all()[0:10]
        return render(request, 'show_list.html', {'data_list': data_list, 'count': count, 'page': 1, 'end': end})
    elif paging == 'end':
        Other.objects.filter(id=1).update(data=end * 10, page=end)
        data_list = StudentInfo.objects.all()[end * 10 - 10:end * 10]
        return render(request, 'show_list.html', {'data_list': data_list, 'count': count, 'page': end, 'end': end})

在vue框架中做的分页器组件:

超级详细:一个漂亮的Vue分页器组件的实现_打不着的大喇叭的博客-CSDN博客

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Django 中可以使用分页器 Paginator 来实现数据库分页。具体实现步骤如下: 1. 在视图函数中使用 Paginator 对象进行分页设置: ```python from django.core.paginator import Paginator def my_view(request): # 获取数据 data_list = MyModel.objects.all() # 每页显示数量 per_page = 10 # 创建分页对象 paginator = Paginator(data_list, per_page) # 获取当前页码 page = request.GET.get('page') # 获取当前页的数据 data = paginator.get_page(page) # 渲染模板 return render(request, 'my_template.html', {'data': data}) ``` 上述代码中,首先获取数据列表 data_list,然后通过 Paginator 对象创建分页器 paginator,并设置每页显示数量为 per_page。在获取当前页码 page 后,通过 `get_page()` 方法获取当前页数据 data,并将数据传递给模板进行渲染。 2. 在模板中使用分页器对象进行渲染: ```html {% for item in data %} <!-- 显示数据 --> {% endfor %} <!-- 显示分页链接 --> <div class="pagination"> <span class="step-links"> {% if data.has_previous %} <a href="?page=1">« 第一页</a> <a href="?page={{ data.previous_page_number }}">上一页</a> {% endif %} <span class="current-page"> {{ data.number }} / {{ data.paginator.num_pages }} </span> {% if data.has_next %} <a href="?page={{ data.next_page_number }}">下一页</a> <a href="?page={{ data.paginator.num_pages }}">最后一页 »</a> {% endif %} </span> </div> ``` 在模板中,首先通过遍历 `data` 变量来显示当前页数据。然后,使用分页器对象的 `has_previous`、`previous_page_number`、`number`、`paginator.num_pages`、`has_next` 和 `next_page_number` 属性来生成分页链接,使用户可以通过链接跳转到其他页面。 以上就是 Django 中使用 Paginator 实现数据库分页的基本步骤。需要注意的是,具体使用方式可能会因个人习惯和项目需求而有所不同,建议查看官方文档并根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打不着的大喇叭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值