В интерфейсе администратора Django есть способ дублировать элемент?

Просто интересно, есть ли простой способ добавить функциональность для дублирования существующего списка в интерфейсе администратора?

При вводе данных мы столкнулись с ситуацией, когда многие элементы обмениваются общими данными с другим элементом, и для экономии времени было бы очень удобно быстро продублировать существующий список и изменить только измененные данные. Использование более совершенной структуры модели было бы одним из способов уменьшения дублирования данных, но может возникнуть ситуация, когда дублированные данные должны быть изменены в индивидуальном порядке в будущем.

2 ответа

Решение

Вы можете сохранить как, просто включив добавление этого в свой ModelAdmin:

save_as = True

Это заменяет кнопку "Сохранить и добавить еще" на кнопку "Сохранить как". "Сохранить как" означает, что объект будет сохранен как новый объект (с новым идентификатором), а не как старый объект.

Здесь есть лучшее (но не встроенное) решение:

https://github.com/RealGeeks/django-modelclone

Из их README:

Джанго Админ имеет save_as функция, которая добавляет новую кнопку на страницу изменений, чтобы сохранить новый экземпляр этого объекта.

Мне не нравится, как эта функция работает, потому что вы сохраните идентичную копию исходного объекта (если вы не получите ошибок проверки), как только вы нажмете эту ссылку, и если вы забудете внести небольшие изменения, которые вы В новом объекте вы получите дубликат существующего объекта.

С другой стороны, django-modelclone предлагает промежуточное представление, которое в основном предварительно заполняет форму для вас. Таким образом, вы можете изменить, а затем сохранить новый экземпляр. Или просто уйти без побочных эффектов.

Вы также можете применить этот метод: /questions/24316106/sozdajte-dejstvie-administratora-django-dlya-dublirovaniya-zapisi/24316117#24316117

В моем случае с уникальным ограничением в поле 'name' это действие работает, и его можно запросить из любой формы:


def duplicate_jorn(modeladmin, request, queryset):
    post_url = request.META['HTTP_REFERER']

    for object in queryset:
        object.id = None
        object.name = object.name+'-b'
        object.save()

    return HttpResponseRedirect(post_url)

Другие вопросы по тегам