取消django admin save_model()

时间:2016-01-17 17:30:04

标签: python django django-admin

我为某些模型覆盖了django-admin的save_model,因此在某些情况下不会保存模型。

def save_model(self, request, obj, form, change):
    """При сохранении списка проверить на совпадения.

    - Не должно быть двух CTR 0 списков для одной страы
    - Не должно быть двух CTR low списков для одной страны,
            подхода, ограничения по трафику, пользователя и рекламной сети.
    """
    cls = obj.__class__
    if obj.type == ListTypes.ctr0.value:
        existing_lists = (cls.objects
                          .filter(country=obj.country,
                                  user=obj.user,
                                  type=obj.type)
                          .exclude(pk=obj.pk)
                          .all())
        if existing_lists:
            msg = 'Список CTR 0 для страны {} уже существует.'
            msg = msg.format(obj.country)
            self.message_user(request, _(msg), level=messages.ERROR)
            return
        if obj.angle or obj.traffic_restriction:
            msg = ('Для списков CTR 0 нельзя задавать подходы '
                   'и ограничения по трафику.')
            self.message_user(request, _(msg), level=messages.ERROR)
            return
        obj.save()

当编辑对象并且满足未保存的条件时,它不会被保存,错误信息会闪烁,一切都会正常。

但是,当添加新对象并且满足未保存的条件时,该对象不会再次保存,但django会崩溃。

崩溃看起来像这样

TypeError at /admin/pubscout/list/add/
coercing to Unicode: need string or buffer, NoneType found

崩溃点在于原生django记录器代码:

            if add:
                self.log_addition(request, new_object, change_message)
                return self.response_add(request, new_object)
            else:
                self.log_change(request, new_object, change_message)
                return self.response_change(request, new_object)

基本上,它尝试记录保存对象的操作,但该对象不存在,因此new_object为None,并且记录器崩溃。

如何避免这种情况?有没有办法有条件地禁用日志记录或其他什么?

1 个答案:

答案 0 :(得分:0)

save_model方法必须保存实例是正确的。它不适用于任何类型的验证。为此,您可以创建一个通过“干净”方法实现验证的自定义表单。

查看https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#adding-custom-validation-to-the-admin