2014-10-24 4 views
8

У меня есть обработчик сигнала pre_save на кучу моделей, которые пишут в другую базу данных. Если что-то пойдет не так, я хотел бы прекратить все сохранение или не дать сообщение пользователю.Исключить ошибку при сохранении admin в Django?

на основе Display custom message from signal in the admin, я написал подмешать с методами, как:

class SafeSaveMixin(object): 
    def save_model(self, request, *args, **kwargs): 
     try: 
      return super(SafeSaveMixin, self).save_model(request, *args, **kwargs) 
     except Exception as e: 
      self.message_user(request, e, messages.ERROR) 

Это позволяет мне выбросить исключение из pre_save обработчика и показать пользователю сообщение. Проблема в том, что, хотя это приводит к пропуску фактического Model.save(), консоль администратора ничего не видит, поэтому она все равно сообщает об успешном сохранении объекта.

Если я изменил pre_save обработчик к post_save обработчику, который позволил бы основанию Model.save() произойти и по крайней мере Джанго бы сообщить правильное положение вещей, но информация мне нужно в другой базе данных на основе предыдущий Состояние объекта, поэтому мне нужно добраться до него до сохранения.

Я также рассмотрела начинку сообщения об ошибке в самом объект в pre_save и потянув ее в Mixin-х save_model() - но это становится все более сложным в других ModelAdmin сохранить методы, как save_formset().

Есть ли хороший способ сделать это?

+0

Попробуйте это - https://stackoverflow.com/questions/2177720/показ-таможенно-модель-проверка-исключения-в-Джанго-админ-сайт/39512190 # 39512190 – spinkus

ответ

1

Улавливание таких ошибок не должно быть желательным. Это может означать, что вы предоставляете тонкую информацию своим пользователям, например. о базе данных (если есть IntegrityError). Поскольку это обходит обычную обработку ошибок, вы также можете пропустить сообщения, сообщающие об ошибках.

Если есть какая-то проверка требуется для неправильных/неполных данных пользователь ввел, то путь, чтобы сделать это в def clean(self)

def clean(self): 
    cleaned_data = super(ContactForm, self).clean() 
    field_value = cleaned_data.get('field_name') 
    if not field_value: 
     raise ValidationError('No value for field_name') 
Смежные вопросы