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

Django Admin自定义动作:获取选中QuerySet的ID并跳转至PDF页面

解决Django Admin自定义动作跳转动态ID的PDF页面问题

问题分析

你当前代码里的URL用了硬编码的固定ID,需要从选中的queryset里动态获取对应ID,同时要考虑到单个PDF对应单个采购项的场景,得处理多选的情况。

修改后的代码

from django.contrib import admin
from django.http import HttpResponseRedirect
from django.contrib import messages
import your_app.models as models  # 替换成你的实际app名称

@admin.register(models.PurchaseItem)
class PurchaseItemAdmin(admin.ModelAdmin):
    list_display = ('id', 'product', 'supplier', 'quantity')

    @admin.action(description='View Invoice')
    def view_invoice(self, request, queryset):
        # 限制仅选择单个采购项
        if queryset.count() == 1:
            # 提取选中对象的ID
            item_id = queryset.first().id
            # 动态拼接URL并跳转
            return HttpResponseRedirect(f'/purchases/{item_id}/generatePDF')
        # 多选时给出错误提示
        self.message_user(request, "请仅选择一个采购项目查看对应发票", level=messages.ERROR)

    actions = [view_invoice]

关键修改点

  • 重命名动作函数:把get_context_data改成view_invoice,避免和Django视图类的内置方法冲突,语义更清晰。
  • 限制选中数量:通过queryset.count()判断是否仅选中单个对象,确保跳转的PDF页面对应唯一的采购项。
  • 动态获取ID:用queryset.first().id提取选中对象的ID,再通过f-string动态生成目标URL。
  • 错误反馈:用户多选时,用self.message_user在Admin页面给出明确的错误提示。

补充说明

如果你的PDF生成逻辑支持批量处理,可以修改逻辑把多个ID拼接进URL,示例如下:

item_ids = ",".join([str(item.id) for item in queryset])
return HttpResponseRedirect(f'/purchases/generatePDF?ids={item_ids}')

这种情况需要你对应的PDF生成视图支持接收多个ID的参数。

内容的提问来源于stack exchange,提问作者Sesshōmaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:50:27