在Django管理界面中,有没有办法复制项目?


71

只是想知道是否有一种简单的方法来添加功能以复制管理界面中的现有清单?

在数据输入中,我们遇到了很多项目与另一个项目共享通用数据的情况,并且为了节省时间,快速复制现有清单并仅更改更改的数据将非常好。使用更好的模型结构将是减少数据重复的一种方法,但是将来可能会出现需要重复更改重复数据的情况。

Answers:


120

您可以通过将其添加到ModelAdmin中来保存为

save_as = True

这将“保存并添加另一个”按钮替换为“另存为”按钮。“另存为”表示该对象将另存为新对象(具有新ID),而不是旧对象。


2
这对我来说并不明显,我发现另一个题为“ Sample admin.py”的问题表明您需要从ModelAdmin派生,然后使用admin.site.register(Person, PersonAdmin)(如果PersonAdmin是您的派生类)而不是使用admin.site.register(Person)
sage

8

这里有一个更好的(但不是内置的)解决方案:

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

从他们的自述文件中:

Django Admin的save_as功能是在“更改”页面上添加新按钮,以保存该对象的新实例。

我不喜欢此功能的工作方式,因为单击该链接后,如果忘记进行一些小的更改,您将保存原始对象的相同副本(如果未收到验证错误)。在新对象中需要时,您将得到现有对象的副本。

另一方面,django-modelclone提供了一个中间视图,该视图基本上为您预填充了表单。因此,您可以修改然后保存新实例。或者只是走开而没有副作用。


0

您也可以应用此方法:https : //stackoverflow.com/a/4054256/7995920

就我而言,在“名称”字段中具有唯一性约束的情况下,此操作有效,并且可以通过任何形式进行请求:


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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.