我为某些模型覆盖了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,并且记录器崩溃。
如何避免这种情况?有没有办法有条件地禁用日志记录或其他什么?
答案 0 :(得分:0)
save_model方法必须保存实例是正确的。它不适用于任何类型的验证。为此,您可以创建一个通过“干净”方法实现验证的自定义表单。
查看https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#adding-custom-validation-to-the-admin