如何仅打印Django Admin的change_list页面且不含筛选器?
实现Django Admin Change List页面打印时隐藏筛选器的方案
嘿,这个需求很实用,我刚好有几个靠谱的方案,完全不用全局移除list_filter,既能保留日常的筛选功能,又能满足打印时只显示列表的需求:
方案一:CSS媒体查询(最简单,无后端改动)
这是最省心的方法,利用CSS的打印媒体查询,让浏览器在打印时自动隐藏筛选器区域,平时浏览不受影响。
步骤如下:
- 在你的Django项目模板目录下,创建
admin/change_list.html(如果没有就从Django默认的Admin模板里复制一份过来) - 在模板的
<head>部分添加打印专属的样式:
@media print { /* 隐藏筛选器侧边栏 */ #changelist-filter { display: none !important; } /* 让列表内容占满整个打印页面宽度 */ #changelist-form .results { width: 100% !important; margin-left: 0 !important; } /* 可选:隐藏顶部的操作按钮栏,让打印更清爽 */ .object-tools { display: none !important; } }
设置完成后,用户按Ctrl+P(或系统打印快捷键)时,筛选器就会自动消失,直接打印干净的列表内容。
方案二:添加专属打印按钮,跳转无筛选器页面(更灵活)
如果想要给用户一个明确的“打印列表”按钮,点击后直接展示无筛选器的页面再打印,可以用这个方法:
1. 自定义Admin类,添加打印按钮的URL上下文
from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from .models import YourModel class YourModelAdmin(admin.ModelAdmin): list_filter = ['your_filter_field', 'another_filter'] # 保留原有筛选器配置 def changelist_view(self, request, extra_context=None): extra_context = extra_context or {} # 生成打印页面的URL,替换成你的app和model名称 extra_context['print_list_url'] = reverse('admin:your_app_yourmodel_print') return super().changelist_view(request, extra_context)
2. 添加打印页面的URL路由
在项目的urls.py里新增一条路由:
from django.urls import path from django.contrib.admin.views.decorators import staff_member_required from .views import print_change_list urlpatterns = [ # ... 其他已有路由 path('admin/your_app/yourmodel/print/', staff_member_required(print_change_list), name='admin:your_app_yourmodel_print'), ]
3. 编写打印视图
from django.shortcuts import render from .models import YourModel from .admin import YourModelAdmin def print_change_list(request): # 初始化Admin类,获取列表数据和上下文 model_admin = YourModelAdmin(YourModel, admin.site) # 获取原change_list的上下文,添加标记隐藏筛选器 context = model_admin.changelist_view(request).context_data context['hide_filters'] = True # 渲染自定义的打印模板 return render(request, 'admin/your_app/yourmodel/print_change_list.html', context)
4. 创建打印专用模板
复制原change_list.html到admin/your_app/yourmodel/print_change_list.html,然后修改筛选器区块:
{% extends "admin/change_list.html" %} {% block filters %} {% if not hide_filters %} {{ block.super }} {% endif %} {% endblock %}
这样用户点击打印按钮后,会跳转到一个没有筛选器的页面,直接打印即可。
方案三:JavaScript动态隐藏(快速轻量)
如果不想改动太多模板和后端,纯前端就能实现:
在自定义的change_list.html里,在object-tools区块添加按钮和脚本:
{% block object-tools %} {{ block.super }} <button id="print-list-btn" class="button">打印列表</button> <script> document.getElementById('print-list-btn').addEventListener('click', function() { const filterPanel = document.getElementById('changelist-filter'); const originalStyle = filterPanel.style.display; // 隐藏筛选器 filterPanel.style.display = 'none'; // 触发打印 window.print(); // 打印完成后恢复筛选器显示 filterPanel.style.display = originalStyle; }); </script> {% endblock %}
点击按钮时,脚本会临时隐藏筛选器,调用系统打印,打印结束后自动恢复筛选器的显示,非常便捷。
内容的提问来源于stack exchange,提问作者Lorenzo Ang
相关产品推荐
相关产品推荐

