Na interface de administração do Django, há uma maneira de duplicar um item?
-
05-07-2019 - |
Pergunta
Basta saber se existe uma maneira fácil de adicionar a funcionalidade para duplicar um existente listando na interface de administração?
Na entrada de dados que temos correr em uma situação onde um monte de itens de compartilhar dados genéricos com outro item, e para poupar tempo que seria muito bom para duplicar rapidamente uma lista existente e só alterar os dados alterados. Usando uma estrutura melhor modelo seria uma forma de reduzir a duplicação dos dados, mas pode haver situações em que as necessidades de dados duplicados para ser mudado de forma individual no futuro.
Solução
Você pode salvar como por apenas permitindo adicionar esta a sua ModelAdmin:
save_as = True
Este substitui o "Salvar e adicionar outro" botão com um "Salvar como" botão. "Salvar como" significa que o objeto será guardado como um novo objeto (com um novo ID), em vez do objeto de idade.
Outras dicas
Há uma solução melhor (mas não built-in) aqui:
https://github.com/RealGeeks/django-modelclone
A partir de sua README:
Django Admin tem uma característica
save_as
que adiciona um novo botão ao seu Mudar página para salvar uma nova instância do objeto.Eu não gosto da maneira como esse recurso funciona, porque você vai salvar um cópia idêntica do objeto original (se você não obter a validação erros) Assim que você clicar nesse link, e se você se esquecer de fazer a pequenas mudanças que você queria no novo objeto que você vai acabar com um duplicar do objeto existente.
Por outro lado, o Django-modelclone oferece uma visão intermediária, que basicamente pré-preenche o formulário para você. Então, você pode modificar e salve uma nova instância. Ou simplesmente ir embora sem efeitos colaterais.
Você também pode aplicar este método: https://stackoverflow.com/a/4054256/7995920
No meu caso, com restrição exclusiva no campo 'nome', isso funciona de ação, e pode ser solicitado de qualquer forma:
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)