2010-10-21 8 views
3

Je souhaite créer une action d'administration Django qui me permet de créer une copie d'un enregistrement.Création d'une action d'administration Django pour dupliquer un enregistrement

Voici le cas d'utilisation.

L'administrateur clique sur la case en regard d'un enregistrement dans une application qu'il souhaite dupliquer. Admin sélectionne "Dupliquer" dans le menu déroulant d'action d'administration. Les clics administrateur vont. L'administrateur Django crée un enregistrement en double avec un nouvel identifiant. La page est réorganisée et un nouveau doublon est ajouté avec l'ID. L'administrateur clique sur le nouvel enregistrement dupliqué et l'édite. L'administrateur clique sur Enregistrer.

Est-ce que je suis folle ou est-ce une action d'admin assez simple?

Je me sers de ces documents de référence: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

Je pense quelque chose comme ceci:

Dans mon application:

def duplicate(modeladmin, request, queryset): 
    new = obj.id 
    queryset.create(new) 
    return None 
duplicate.short_description = "Duplicate selected record" 

Je sais que ce ne va pas ... mais est-ce que ma pensée est proche?

+1

ce n'est pas une action, mais vous pouvez obtenir un lien « Enregistrer sous » sous la forme de modifier cette façon: http://stackoverflow.com/questions/180809/in-the-django-admin-interface- est-il-un-moyen-de-dupliquer-un-article –

Répondre

8

Vous avez la bonne idée mais vous devez parcourir le jeu de requête puis dupliquer chaque objet.

def duplicate_event(modeladmin, request, queryset): 
    for object in queryset: 
     object.id = None 
     object.save() 
duplicate_event.short_description = "Duplicate selected record" 
+2

Maintenant, l'astuce est de savoir comment dupliquer les modèles FK qui pointent vers ce modèle. –

+0

N'oubliez pas d'ajouter également l'action en double à la liste des actions dans la classe MyappAdmin pour votre application Myapp: actions = [duplicate_event] – tatlar

+0

Pour copier FK et M2M, lisez [link] (http://blogs.law.harvard.edu/rprasad/2012/08/24/using-django-admin-to-copy-a-object /) –

0

Peut-être que cela fonctionne pour vous.

def duplicate_query_sets(queryset, **kwargs): 
    for p in queryset: 
     p.pk = None 
     for i, v in kwargs.iteritems(): 
      setattr(p, i, v) 

     p.save()