2012-05-30 3 views
3

Я пытаюсь переопределить метод удаления для модели с именем Invoice. Модель-фактура ссылается на ForeignKey в действии модели. Я хочу, чтобы обновить BooleanField по имени счет в модели администратора, когда это счет-фактура будет удаленПереопределить delete_selected() и поля обновления дочерней модели

решение, описанное в этой статье:

How do I override delete() on a model and have it still work with related deletes

, что ответить: https://stackoverflow.com/a/1539182

не работает для меня например,

def delete(self): 
     Action.objects.filter(invoice=self).update(billed=False) # and tried 0 instead of False 
     super(Invoice,self).delete() 

также пытался:

def delete(self): 
    actions = Action.objects.filter(invoice=self) 
    for action in actions: 
     action.billed=False # and tried 0 instead of False 
     action.save() 
    super(Invoice,self).delete() 

Поле ForeignKey в Model Action имеет параметр on_delete = models.SET_NULL, чтобы избежать удаления действий при удалении счета-фактуры. Но мне также нужно вернуть счет False.

invoice = models.ForeignKey(Invoice, verbose_name = 'Rechnung', null=True, blank=True,on_delete=models.SET_NULL) 

Я только что прочитал здесь https://code.djangoproject.com/ticket/10751 что в администраторе действия удалять выбранный не может быть overridde со стиранием()

Я должен использовать delete_view() вместо

Так что я попытался

def delete_selected(self, request, obj, extra_context=None): 
    Action.objects.filter(invoice=self).update(billed=False) 
    super(InvoiceAdmin, self).delete_view(request, obj, extra_context) 

Также попытался использовать obj вместо self, но не решение

+0

Когда вы говорите «не работает», что вы имеете в виду, являются ли объекты действия не обновляемыми или объекты-объекты не удаляются или оба? Вы ошиблись? – scoopseven

+0

Счета-фактуры обновляются (удаляются), но ничего не происходит с действиями. Действие delete() или delete_selected() не было переопределено. Теперь он работает с get_actions и del deleted_selected и передает, чем произвольное действие delete_model для модели. – surfi

ответ

6

Хотя this answer работает, если вы удалите один obj где-нибудь еще в вашем коде, метод delete_model выбросит ошибка.

Я рекомендую это:

actions = ['delete_selected'] 

def delete_selected(self, request, obj): 
    for o in obj.all(): 
     Action.objects.filter(invoice=o).update(billed=False) 
     o.delete() 

delete_selected.short_description = 'Ausgewählte Rechnungen löschen' 

Просто переопределить delete_selected действие для этой страницы администратора Изменение списка. Таким образом, вам не нужно полностью удалять действие, переопределить метод delete_model, и в качестве плюса вы все равно можете удалить отдельные элементы с страницы администрирования Change <object>. В конечном счете это меньше кода. :)

7

Я нашел решение, postet y Stephane https://stackoverflow.com/a/4534773/326905 и отредактировал его для моей проблемы.

Правильное действие delete_selected В admin.py под InvoiceAdmin Модель

actions = ['delete_model'] 

def get_actions(self, request): 
    actions = super(InvoiceAdmin, self).get_actions(request) 
    del actions['delete_selected'] 
    return actions 

def delete_model(self, request, obj): 
    for o in obj.all(): 
     Action.objects.filter(invoice=o).update(billed=False) 
     o.delete() 

delete_model.short_description = 'Ausgewählte Rechnungen löschen' 
+1

Это приведет к ошибке при удалении этой модели с помощью экрана редактирования. –

Смежные вопросы