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

Django Admin实现对象复制:点击链接预填指定字段至新增表单

解决方案:无需自定义Admin Action,通过自定义Admin路由实现

不需要使用自定义Admin Action来实现这个需求,Admin Action主要用于列表页的批量操作场景,而单个对象的复制跳转更适合通过自定义Admin路由+重定向来实现,步骤如下:

实现步骤

  1. 在admin.py中自定义TaskAdmin类,扩展路由并添加复制视图
  2. 复制视图获取目标对象数据,重定向到新增页面并携带预填字段的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 23:13:14