2010-10-21 3 views
3

Я хочу создать действие администратора Django, которое позволяет мне создать дубликат записи.Создайте действие администратора Django для дублирования записи

Heres прецедент.

Администратор нажимает флажок рядом с записью в приложении, которое они хотят дублировать. Admin выбирает «Duplicate» из раскрывающегося меню действия администратора. Администратор нажимает кнопку мыши. Django admin создает дубликат записи с новым идентификатором. Страница обновляется, а новый дубликат добавляется с идентификатором. Администратор нажимает на новую дублируемую запись и редактирует ее. Администратор нажимает кнопку «Сохранить».

Я сошел с ума или это довольно прямое действие Админ?

Я использую эти документы для справки: http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/

Я что-то подобное мышление:

В моем приложении:

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

Я знаю, что это не так ... но мое мышление близко?

+1

это не действие, но вы можете получить «сохранить как» ссылки в форме редактирования следующим образом: http://stackoverflow.com/questions/180809/in-the-django-admin-interface- is-to-way-to-duplicate-an-item –

ответ

8

У вас есть правильная идея, но вам нужно выполнить итерацию через набор запросов, затем дублировать каждый объект.

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

Теперь трюк заключается в том, как дублировать любые модели FK, которые указывают на эту модель. –

+0

Не забудьте также добавить дублирующее действие в список действий в классе MyappAdmin для вашего приложения. Myapp: действия = [duplicate_event] – tatlar

+0

Чтобы скопировать FK и M2M, прочитайте [link] (http://blogs.law.harvard.edu)./rprasad/2012/08/24/using-django-admin-to-copy-an-object /) –

0

Возможно, эта работа для вас.

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()