76 votes

Dans l'interface d'administration de Django, existe-t-il un moyen de dupliquer un élément ?

Je me demandais s'il existait un moyen simple d'ajouter la fonctionnalité de duplication d'une liste existante dans l'interface d'administration ?

Lors de la saisie des données, nous avons rencontré une situation dans laquelle de nombreux articles partagent des données génériques avec un autre article et, 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. L'utilisation d'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 sur une base individuelle à l'avenir.

133voto

Harley Holcombe Points 34618

Vous pouvez enregistrer sous en l'ajoutant simplement à votre ModelAdmin :

save_as = True

Le bouton "Enregistrer et ajouter un autre" est remplacé par un bouton "Enregistrer sous". "Enregistrer sous" signifie que l'objet sera enregistré en tant que nouvel objet (avec un nouvel identifiant), et non en tant qu'ancien objet.

3 votes

La mise en œuvre de cette mesure n'était pas évidente pour moi et j'ai constaté que la section d'une autre question intitulée "Exemple admin.py". montre qu'il faut dériver de ModelAdmin et utiliser la méthode admin.site.register(Person, PersonAdmin) (si PersonAdmin est votre classe dérivée) au lieu d'utiliser admin.site.register(Person)

9voto

kontextify Points 266

Il existe une meilleure solution (mais qui n'est pas intégrée) :

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

Extrait du README :

Django Admin dispose d'une fonction save_as qui ajoute un nouveau bouton t pour enregistrer une nouvelle instance de cet objet.

Je n'aime pas la façon dont cette fonction fonctionne car vous sauvegarderez une copie identique de l'objet original (si vous n'obtenez pas la validation). [ ] de validation) dès que vous cliquez sur ce lien, et si vous oubliez d'apporter les les petites modifications que vous vouliez apporter au nouvel objet, vous vous retrouverez avec un double de l'objet existant. duplicata de l'objet existant.

D'autre part, django-modelclone offre une vue intermédiaire, qui pré-remplit le formulaire pour vous. Vous pouvez donc modifier puis enregistrer une nouvelle instance. Ou simplement partir sans effets secondaires.

0voto

Abel Points 11

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X