En la interfaz de administración de Django, ¿hay una manera de duplicar un elemento?
-
05-07-2019 - |
Pregunta
¿Se pregunta si hay una manera fácil de agregar la funcionalidad para duplicar una lista existente en la interfaz de administración?
En la entrada de datos nos hemos encontrado con una situación en la que muchos elementos comparten datos genéricos con otro, y para ahorrar tiempo sería bueno duplicar rápidamente un listado existente y solo alterar los datos modificados. Utilizar una estructura de modelo mejor sería una forma de reducir la duplicación de los datos, pero puede haber una situación en la que los datos duplicados deban cambiarse de forma individual en el futuro.
Solución
Puede guardar como simplemente habilitando agregar esto a su ModelAdmin:
save_as = True
Esto reemplaza el " Guardar y agregar otro " botón con un " Guardar como " botón. " Guardar como " significa que el objeto se guardará como un nuevo objeto (con un nuevo ID), en lugar del objeto antiguo.
Otros consejos
Aquí hay una solución mejor (pero no incorporada):
https://github.com/RealGeeks/django-modelclone
Desde su README:
Django Admin tiene una función
save_as
que agrega un nuevo botón a tu Cambiar página para guardar una nueva instancia de ese objeto.No me gusta la forma en que funciona esta función porque guardarás un Copia idéntica del objeto original (si no obtiene la validación errores) tan pronto como haga clic en ese enlace, y si olvida hacer la pequeños cambios que deseabas en el nuevo objeto, terminarás con una duplicado del objeto existente.
Por otro lado, django-modelclone ofrece una vista intermedia, que Básicamente rellena el formulario por ti. Para que pueda modificar y luego guardar una nueva instancia O simplemente desaparecer sin efectos secundarios.
También puede aplicar este método: https://stackoverflow.com/a/4054256/7995920
En mi caso, con una restricción única en el campo 'nombre', esta acción funciona y se puede solicitar desde cualquier formulario:
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)