Dans l'interface d'administration de Django, existe-t-il un moyen de dupliquer un élément?
-
05-07-2019 - |
Question
Je me demandais s'il existait un moyen facile d'ajouter la fonctionnalité permettant de dupliquer une liste existante dans l'interface d'administration?
Lors de la saisie des données, nous avons rencontré une situation dans laquelle de nombreux éléments partagent des données génériques avec un autre élément. Pour gagner du temps, il serait très agréable de dupliquer rapidement une liste existante et de ne modifier que les données modifiées. Utiliser une meilleure structure de modèle serait un moyen de réduire la duplication des données, mais il peut arriver que les données dupliquées doivent être modifiées individuellement à l'avenir.
La solution
Vous pouvez enregistrer sous en activant simplement l'ajout de ceci à votre ModelAdmin:
save_as = True
Ceci remplace les options "Enregistrer et ajouter un autre". bouton avec un " Enregistrer sous " bouton. " Enregistrer sous " signifie que l'objet sera enregistré en tant que nouvel objet (avec un nouvel ID), plutôt que l'ancien objet.
Autres conseils
Il existe une meilleure solution (mais pas intégrée) ici:
https://github.com/RealGeeks/django-modelclone
À partir de leur fichier README:
Django Admin a une fonctionnalité
save_as
qui ajoute un nouveau bouton à votre Changer de page pour enregistrer une nouvelle instance de cet objet.Je n'aime pas le fonctionnement de cette fonctionnalité car vous économiserez un copie identique de l'objet d'origine (si vous ne recevez pas de validation erreurs) dès que vous cliquez sur ce lien, et si vous oubliez de faire la petits changements que vous vouliez dans le nouvel objet, vous vous retrouverez avec un dupliquer l'objet existant.
D'autre part, Django-modelclone offre une vue intermédiaire, qui fondamentalement pré-remplit le formulaire pour vous. Ainsi, vous pouvez modifier puis sauvegarder une nouvelle instance. Ou simplement partir sans effets secondaires.
Vous pouvez également appliquer cette méthode: https://stackoverflow.com/a/4054256/7995920
Dans mon cas, avec une contrainte unique dans le champ "nom", cette action fonctionne et peut être demandée à partir de n’importe quel formulaire:
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)