Вставьте данные объекта в форму администратора
Нужна помощь. У меня есть объект, который я добавляю с помощью стандартной формы администрирования по ссылке /admin/tasklist/task/add/
model.py
class Task(models.Model):
name = models.CharField("Name", max_length=100)
discr = models.CharField("Discription", max_length=255)
date = models.DateField("Date")
status = models.IntegerField("Status", default=2)
def __str__(self):
return self.name
def natural_key(self):
return (self.name)
class Meta:
db_table = 'tasks'
verbose_name = 'Task'
verbose_name_plural = 'Tasks'
Я хочу иметь возможность копировать объект после внесения правок из той же формы администрирования. Мне нужно, чтобы при нажатии на ссылку /admin/tasklist/task/1/copy открывалась форма добавления объекта, а в поля статус и дата вставлялись данные из объекта 1.
Может быть, мне нужно создать одно пользовательское действие администратора для этого?
Rather than creating custom admin for this , why not you just create 2 views , where in view 1-> you insert object and view2 ->you copy object
Это можно сделать, хотя и не сразу. Мы можем определить миксин, который добавляет путь /<path:object_id>/copy/
, и в этом случае вернуть в качестве объекта редактирования тот же самый объект, за исключением того, что мы удаляем первичный ключ, например:
from functools import update_wrapper
from django.contrib import admin
class DuplicateAdminMixin:
def copy_view(self, request, object_id, extra_context=None):
request.copying = True
return self.change_view(request, object_id, extra_context)
def get_object(self, request, object_id, from_field=None):
object = super().get_object(request, object_id, from_field=from_field)
if getattr(request, 'copying', False):
object.pk = None
return object
def get_urls(self):
urls = super().get_urls()
info = self.opts.app_label, self.opts.model_name
from django.urls import path
def wrap(view):
def wrapper(*args, **kwargs):
return self.admin_site.admin_view(view)(*args, **kwargs)
wrapper.model_admin = self
return update_wrapper(wrapper, view)
custom_urls = [
path(
'<path:object_id>/copy/',
wrap(self.copy_view),
name='%s_%s_copy' % info,
),
]
return custom_urls + urls
тогда вы можете смешать DuplicateAdminMixin
в вашем ModelAdmin
:
class TaskAdmin(DuplicateAdminMixin, admin.ModelAdmin):
# …
тогда, если у вас есть объект с первичным ключом 1
, вы можете перейти к /admin/app_label/model_name/1/copy/
, чтобы получить форму с данными этого элемента, но при сохранении объекта будет создана его копия.
Данные из связанных моделей не копируются.