【发布时间】:2014-12-20 15:42:40
【问题描述】:
我在一堆模型上有一个pre_save 信号处理程序,它们写入不同的数据库。如果出现问题,我想中止整个保存,或者失败时向用户发送消息。
基于Display custom message from signal in the admin,我写了一个mixin,方法如下:
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() 发生,并且至少 Django 会报告正确的状态,但我需要在另一个数据库中的信息是基于对象的 previous 状态,所以我需要在保存之前到达它。
我还考虑将错误消息填充到 pre_save 中的对象本身中,并将其从 mixin 的 save_model() 中提取出来——但这在其他 ModelAdmin 保存方法中变得更加复杂,例如 save_formset() .
有什么好的方法吗?
【问题讨论】:
标签: django django-admin