Вставьте данные объекта в форму администратора

Нужна помощь. У меня есть объект, который я добавляю с помощью стандартной формы администрирования по ссылке /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/, чтобы получить форму с данными этого элемента, но при сохранении объекта будет создана его копия.

Данные из связанных моделей не копируются.

Вернуться на верх