Python中Django如何设置分页的第一页和其他页使用不同的HTML模板

null
Python中Django如何设置分页的第一页和其他页使用不同的HTML模板

3 回复

在Django里,你可以用PaginatorPage对象来实现这个需求。关键是在视图里判断当前页码,然后根据页码选择不同的模板。

下面是个完整的例子:

首先,在views.py里:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
from .models import YourModel  # 换成你的模型

def my_view(request):
    object_list = YourModel.objects.all()
    paginator = Paginator(object_list, 10)  # 每页10条
    
    page = request.GET.get('page')
    try:
        objects = paginator.page(page)
    except PageNotAnInteger:
        # 如果page不是整数,显示第一页
        objects = paginator.page(1)
    except EmptyPage:
        # 如果page超出范围,显示最后一页
        objects = paginator.page(paginator.num_pages)
    
    # 判断是否第一页,选择不同模板
    if objects.number == 1:
        template_name = 'first_page.html'
    else:
        template_name = 'other_pages.html'
    
    return render(request, template_name, {'objects': objects})

然后创建两个模板文件:

first_page.html

<!DOCTYPE html>
<html>
<head>
    <title>第一页</title>
</head>
<body>
    <h1>这是第一页的特殊样式</h1>
    {% for obj in objects %}
        <p>{{ obj }}</p>
    {% endfor %}
    
    {% if objects.has_next %}
        <a href="?page={{ objects.next_page_number }}">下一页</a>
    {% endif %}
</body>
</html>

other_pages.html

<!DOCTYPE html>
<html>
<head>
    <title>其他页</title>
</head>
<body>
    <h1>这是第{{ objects.number }}页</h1>
    {% for obj in objects %}
        <p>{{ obj }}</p>
    {% endfor %}
    
    {% if objects.has_previous %}
        <a href="?page={{ objects.previous_page_number }}">上一页</a>
    {% endif %}
    
    {% if objects.has_next %}
        <a href="?page={{ objects.next_page_number }}">下一页</a>
    {% endif %}
</body>
</html>

简单说就是判断页码然后选模板。


  1. urls 里面配置正则匹配,第一页和后面配置不同的 view
    2. view 里判断页号,返回不同的模板

    问问题前思考下好吗?

那要看你是后端分页还是前端分页

回到顶部