You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin中实现支持自定义每页条数的动态分页?

Django Admin 实现动态分页功能的方法

完全可以实现,核心思路是通过自定义Admin的列表模板添加页数输入控件,再在ModelAdmin中处理请求参数来动态调整分页条数,具体步骤如下:

1. 自定义Change List模板

复制Django默认的change_list.html(路径通常是django/contrib/admin/templates/admin/change_list.html)到你项目的templates/admin/[你的app名]/[你的model名]/目录下,找到{% block pagination %}区块,添加自定义的页数选择表单:

{% block pagination %}
  {{ block.super }}
  <div style="margin: 10px 0; padding-left: 15px;">
    <form method="get" action="" style="display: inline;">
      <!-- 保留原有的查询参数,避免切换页数时丢失筛选条件 -->
      {% for key, value in request.GET.items %}
        {% if key != 'per_page' %}
          <input type="hidden" name="{{ key }}" value="{{ value }}">
        {% endif %}
      {% endfor %}
      <label for="per_page">每页条数:</label>
      <input type="number" id="per_page" name="per_page" min="1" value="{{ cl.paginator.per_page }}" style="width: 60px; margin: 0 5px;">
      <button type="submit" class="button">确定</button>
    </form>
  </div>
{% endblock %}

2. 修改ModelAdmin类处理分页参数

在对应的admin.py文件中,修改你的ModelAdmin类,通过覆盖changelist_view方法读取用户输入的per_page参数,动态设置分页条数:

from django.contrib import admin
from .models import YourModel

class YourModelAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'created_at') # 替换成你的模型字段

    def changelist_view(self, request, extra_context=None):
        # 获取用户输入的每页条数,支持10/20/30等自定义值
        per_page = request.GET.get('per_page')
        # 限制允许的页数范围,防止输入过大值影响性能
        allowed_per_pages = {10, 20, 30, 50, 100}
        if per_page and per_page.isdigit():
            per_page_int = int(per_page)
            self.list_per_page = per_page_int if per_page_int in allowed_per_pages else admin.site.DEFAULT_PER_PAGE
        else:
            self.list_per_page = admin.site.DEFAULT_PER_PAGE # 默认使用Admin的全局默认值
        
        return super().changelist_view(request, extra_context)

admin.site.register(YourModel, YourModelAdmin)

3. 全局生效的优化方案

如果需要给所有Admin页面都加上这个功能,可以创建一个基础Admin类,让其他ModelAdmin继承它:

class BaseDynamicPaginationAdmin(admin.ModelAdmin):
    def changelist_view(self, request, extra_context=None):
        per_page = request.GET.get('per_page')
        allowed_per_pages = {10, 20, 30, 50, 100}
        if per_page and per_page.isdigit():
            per_page_int = int(per_page)
            self.list_per_page = per_page_int if per_page_int in allowed_per_pages else admin.site.DEFAULT_PER_PAGE
        else:
            self.list_per_page = admin.site.DEFAULT_PER_PAGE
        return super().changelist_view(request, extra_context)

# 其他ModelAdmin继承这个类即可
class YourModelAdmin(BaseDynamicPaginationAdmin):
    list_display = ('id', 'name', 'created_at')

内容的提问来源于stack exchange,提问作者tridenT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:25:48