详解Django的 page_kwarg() 函数:指定分页查询参数的名称

  • Post category:Python

page_kwarg()函数是Django框架中用于分页操作的一个重要方法,可以在视图类中使用。其作用是将标准的Django分页参数赋值给要显示的页面内容,并将其传递给页面上的模板。下面是详细的使用方法和演示:

导入分页类和数据模型

在使用page_kwarg()函数前,我们需要导入分页类和数据模型,示例代码如下:

from django.core.paginator import Paginator
from myapp.models import MyModel

初始化分页类

创建一个Paginator对象,将需要分页的对象列表和每页显示的对象数(即每页显示的记录数)作为参数传递进去。

def my_view(request):
    my_objects = MyModel.objects.all()
    records_per_page = 10  # 每页显示的记录数
    paginator = Paginator(my_objects, records_per_page)

获取指定页的对象列表

使用get_page()函数获取指定页数的对象列表。

def my_view(request):
    # 获取page参数(GET请求中)
    page_number = request.GET.get('page')
    my_objects = MyModel.objects.all()
    records_per_page = 10  # 每页显示的记录数
    paginator = Paginator(my_objects, records_per_page)
    # 获取指定页的对象列表
    page_obj = paginator.get_page(page_number)

使用page_kwarg()函数

将分页的参数传递到模板中,使用page_kwarg()函数实现:

def my_view(request):
    # 获取page参数(GET请求中)
    page_number = request.GET.get('page')
    my_objects = MyModel.objects.all()
    records_per_page = 10  # 每页显示的记录数
    paginator = Paginator(my_objects, records_per_page)
    # 获取指定页的对象列表
    page_obj = paginator.get_page(page_number)
    # 将分页参数传递给模板
    context = {'page_obj': page_obj}
    context.update(paginator.page_kwarg)
    return render(request, 'my_template.html', context=context)

在模板中使用page_obj对象即可访问分页功能。

示例一

一种近似支付模式是,用户购物后先通过“冻结”一部分金额的方式进行预授权,等物品确定送达后,再实际扣款。假定我们有一个订单列表页面需要进行分页处理。

from django.core.paginator import Paginator
from myapp.models import Order

def order_list(request):
    order_list = Order.objects.all()
    records_per_page = 10  # 每页显示的记录数
    paginator = Paginator(order_list, records_per_page)
    page_number = request.GET.get('page')  # 获取page参数
    page_obj = paginator.get_page(page_number)  # 获取指定页的对象列表

    # 将分页参数传递给模板
    context = {'page_obj': page_obj}
    context.update(paginator.page_kwarg)
    return render(request, 'order_list.html', context=context)

在模板中可以使用如下的标签语句实现分页操作:

{% if page_obj.has_previous %}
    <li><a href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
    {% if page_obj.number == num %}
        <li class="active"><span>{{ num }} <span class="sr-only">(current)</span></span></li>
    {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
    {% endif %}
{% endfor %}
{% if page_obj.has_next %}
    <li><a href="?page={{ page_obj.next_page_number }}">Next </a></li>
{% endif %}

示例二

另一个例子是博客网站上的文章列表分页显示。

from django.core.paginator import Paginator
from myapp.models import BlogPost

def post_list(request):
    post_list = BlogPost.objects.all()
    records_per_page = 5  # 每页显示的记录数
    paginator = Paginator(post_list, records_per_page)
    page_number = request.GET.get('page')  # 获取page参数
    page_obj = paginator.get_page(page_number)  # 获取指定页的对象列表

    # 将分页参数传递给模板
    context = {'page_obj': page_obj}
    context.update(paginator.page_kwarg)
    return render(request, 'post_list.html', context=context)

在模板中使用如下的标签语句实现分页操作:

{% if page_obj.has_previous %}
    <li><a href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
{% endif %}
{% for num in page_obj.paginator.page_range %}
    {% if page_obj.number == num %}
        <li class="active"><span>{{ num }} <span class="sr-only">(current)</span></span></li>
    {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
    {% endif %}
{% endfor %}
{% if page_obj.has_next %}
    <li><a href="?page={{ page_obj.next_page_number }}">Next </a></li>
{% endif %}