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.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top