Django Admin实现对象复制:点击链接预填指定字段至新增表单
解决方案:无需自定义Admin Action,通过自定义Admin路由实现
不需要使用自定义Admin Action来实现这个需求,Admin Action主要用于列表页的批量操作场景,而单个对象的复制跳转更适合通过自定义Admin路由+重定向来实现,步骤如下:
实现步骤
- 在
admin.py中自定义TaskAdmin类,扩展路由并添加复制视图 - 复制视图获取目标对象数据,重定向到新增页面并携带预填字段的GET参数
具体代码实现
from django.contrib import admin from django.urls import path from django.shortcuts import redirect from .models import Task class TaskAdmin(admin.ModelAdmin): list_display = ('name', 'discr', 'date', 'status') def get_urls(self): # 注册自定义的copy路由 custom_urls = [ path('<int:pk>/copy/', self.admin_site.admin_view(self.copy_task), name='task-copy'), ] # 合并默认路由与自定义路由 return custom_urls + super().get_urls() def copy_task(self, request, pk): # 获取要复制的Task实例 task = Task.objects.get(pk=pk) # 构造新增页面URL,携带status和date的预填参数 add_page_url = ( f"{self.admin_site.name}/tasklist/task/add/" f"?status={task.status}&date={task.date.strftime('%Y-%m-%d')}" ) return redirect(add_page_url) admin.site.register(Task, TaskAdmin)
原理说明
Django Admin的新增表单默认支持通过GET参数预填字段,只要参数名与模型字段名完全匹配:
status参数会直接填充到对应的IntegerField表单控件date参数需要格式化为YYYY-MM-DD(DateField的标准输入格式)
点击/admin/tasklist/task/1/copy时,会自动重定向到新增页面并完成指定字段的预填,无需修改Admin模板。
为什么不用Admin Action?
Admin Action的设计目标是批量处理列表页选中的多个对象(比如批量修改状态、批量导出),而单个对象的复制跳转属于单实例的页面跳转需求,用自定义路由实现更直接、更符合Django Admin的设计逻辑。
内容的提问来源于stack exchange,提问作者user28509854
相关产品推荐
相关产品推荐

