Вот в чем проблема
Поскольку вы обрабатываете сигнал после сохранения , данные об экземпляре уже были вставлены в базу данных до выполнения обработчика сигнала.
Это означает, что sender.objects.get(pk=instance.pk).postcover
и instance.postcover
в приведенном выше коде извлекают одно и то же - недавно сохраненное посткрытие.
Итак, то, что вы называете old_postcover
в своем коде, на самом деле новое сообщение . * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}} Теперь, когда вы полностью переписаны , *1015* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 '* * * * * 10 *
*. ...
if not old_postcover == new_postcover:
if os.path.isfile(old_postcover.path):
os.remove(old_postcover.path)
os.remove(old_postcover_tn.path)
... никогда не запускается, потому что old_postcover
и new_postcover
действительно одно и то же.
Как это исправить?
Вы можете использовать обработчик сигнала pre save .
В обработчике вы извлекаете old postcover из базы данных с помощью sender.objects.get(pk=instance.pk).postcover
(после проверки , как вы это сделали в своем коде, чтобы убедиться, что экземпляр действительно имеет pk).
Затем вы удаляете это старое postcover, и все готово.
Проблема с это решение
Проблема, которую я сразу вижу при переходе по этому маршруту, заключается в том, что вы удаляете старые данные, не зная, будут ли новые данные приниматься базой данных.
Но если смотреть на светлую сторону
Тем не менее, если вы когда-нибудь будете менять пост-обложки через * 105 0 * s, вызов метода is_valid()
в форме выполняет всю проверку экземпляра, поэтому вы можете быть уверены, что в момент выполнения обработчика новые данные в экземпляре были проверены и будут приняты база данных.