2012-02-10 3 views
1

Есть ли способ, которым я могу запретить пользователю удалять последний объект определенного типа (т. Е. Последнюю строку в таблице)? Они должны по-прежнему удалять такой объект в целом, но необходимо обеспечить, чтобы в этом конкретном случае всегда оставалась по крайней мере одна запись - по крайней мере одна запись, связанная с пользователем.В администраторе Django, как предотвратить удаление последнего объекта типа

Я попытался переопределить функцию удаления модели:

def delete(self, *args, **kwargs): 
    others = Presentation.objects.filter(user=self.user).exclude(pk=self.pk) 
    if len(others) < 1: 
     pass 
    else: 
     super(Presentation, self).delete(*args, **kwargs) 

Это работает, но пользователь сказал, что удаление было на самом деле успешным. Я бы предпочел, чтобы сообщение об ошибке отображалось, например, при завершении проверки. Однако валидация применяется только к сохранению, насколько я могу судить.

ответ

2

Можете ли вы попробовать это тоже, пожалуйста?

# admin.py 
class MyModelAdmin(admin.ModelAdmin): 
    def delete_model(self, request, obj): 
     if last_record: 
       storage = messages.get_messages(request) 
       storage.used = True 
       messages.error(request, 'Cannot delete last record.') 
     else: 
       obj.delete() 

Другой вариант может заключаться в том, чтобы скрыть сообщение об успешном сообщении div или span с помощью jQuery.

+0

Это не сработало. 'clean()', по-видимому, вызывается при сохранении, но не при удалении. – pholz

+0

Да, это имеет смысл. Нет причин чистить что-либо при удалении. Виноват. –

+0

Я обновил свой ответ –

1

Я хотел бы предложить вам еще один подход:

1) Создать и подключить сигнал pre_delete и поднять и исключение на вашем состоянии:

def on_delete(sender,**kwargs): 
    if <condition>: 
     raise Exception('Abort delete') 
    #else: continue and delete 

pre_delete.connect(on_delete,sender=Presentation) 

2) Затем, по мнению, вы можете поймать это исключение

# view code... 
try: 
    object.delete() 
except: 
    # add the desired info to context 

во всяком случае, вы можете также переопределить model::delete бросить исключение и поймать его в коде представления.

+0

Что значит «на вид»? Я не использую пользовательский вид, но встроенные django-admin-представления и встроенные шаблоны. Должен ли я написать собственное представление и использовать для этого специальный шаблон? – pholz

+0

Если вы ** ТОЛЬКО **, используя это в админке со встроенными представлениями и шаблонами, то подход dan-klasson лучше, так как ошибки формы уже показаны в шаблонах администратора ... но будьте осторожны, вызывают любую другую операцию удаления не через эту форму администратора не будет проверять ваше состояние: S – jgsogo

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