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

如何在Django Admin修改表单中配置PDF账单下载按钮?

在Django Admin订单修改页添加账单下载按钮

方法一:通过ModelAdmin自定义只读字段实现

在项目的admin.py中,修改OrderAdmin类,添加生成下载按钮的方法,并将其加入只读字段列表:

from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html
from .models import Order

@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    # 保留你原有的Admin配置,比如fields、list_display等
    readonly_fields = ('download_bill_button',)

    def download_bill_button(self, obj):
        # 生成对应订单的下载URL,替换为你实际的路由名称
        download_url = reverse('download-bill', kwargs={'order_id': obj.id})
        # 返回带样式的下载按钮,download属性触发浏览器自动下载
        return format_html(
            '<a href="{}" class="button" download>下载账单</a>',
            download_url
        )
    # 设置按钮在表单中的显示名称
    download_bill_button.short_description = '账单操作'

提示:需要确保你的URL路由已设置名称,比如在urls.py中配置:

path('order/download-bill/<int:order_id>/', views.download_bill, name='download-bill')

方法二:自定义Admin修改页模板(灵活布局)

如果想把按钮放在页面顶部的工具区,可自定义change_form.html模板:

  1. 在你的APP目录下创建路径templates/admin/[你的APP名]/order/,新建change_form.html文件:
{% extends "admin/change_form.html" %}
{% block object-tools-items %}
    {{ block.super }}
    <li>
        <a href="{% url 'download-bill' order_id=original.id %}" class="button" download>下载账单</a>
    </li>
{% endblock %}
  1. 在OrderAdmin中指定自定义模板:
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
    # 保留原有配置
    change_form_template = 'admin/[你的APP名]/order/change_form.html'

额外注意事项

  • 确保你的下载视图download_bill正确返回文件响应(如PDF、Excel),并设置Content-Disposition头触发下载,示例:
    from django.http import FileResponse
    
    def download_bill(request, order_id):
        order = Order.objects.get(id=order_id)
        # 生成或获取账单文件路径,这里以示例文件为例
        bill_file_path = f'/path/to/bills/{order.order_number}.pdf'
        response = FileResponse(open(bill_file_path, 'rb'))
        response['Content-Disposition'] = f'attachment; filename="bill_{order.order_number}.pdf"'
        return response
    
  • 可添加权限控制,比如判断用户是否有下载权限:
    def download_bill_button(self, obj):
        if not self.request.user.has_perm('[你的APP名].download_bill'):
            return ''
        # 后续按钮生成逻辑
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:27:27