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
相关产品推荐
相关产品推荐

