Я делаю небольшую часть программного обеспечения с Django и JS, которые будут обрабатывать загрузки изображений. Все идет нормально. Я получаю красивые маленькие изображения через AJAX от dropzone.js. Они сохраняются в файловой системе и имеют ImageField в моей модели фотографий, чтобы отслеживать, что хранится и где.Получение пути к файлу ImageField post_delete
Я даже заколол dropzone.js, чтобы попросить мой сервер-dev удалить записи базы данных и сами файлы. Я нахожу, что последней части немного. Поэтому я начал писать функцию, которая улавливает сигнал post_delete из моей фотомодели и имеет задачу обработки удаления из файловой системы. Проблема в том, что я не могу найти способ получить путь к файлу, который хранится в базе данных.
Если я правильно понял, то следующее должно работать:
from django.db import models
from django.db.models.signals import post_delete
from django.dispatch import receiver
class Photo(models.Model):
imageFile = models.ImageField(upload_to=generateImageFileNameAndPath)
@receiver(post_delete, sender=Photo)
def cleanupImageFiles(sender, **kwargs):
print("Cleanup called")
p = kwargs['instance']
path = p.imageFile.name
print(path)
Но когда я пытаюсь вывести path
на консоль, там нет ничего.
Извините за верхний регистр, вместо того, чтобы использовать under_scores, как представляется, соглашение Python. Я лично считаю, что соглашение подчеркивания немного раздражает, и у меня есть своя борьба внутри моей головы о том, следует ли следовать конвенции или просто идти своим путем. На данный момент я сделал последнее.
Редактировать: Я не могу заставить это работать с p.imageFile.url
как предложено here.
editedit: Я также попытался с pre_delete сигнала, думая, что, может быть, post_delete данные уже вдребезги, который был бы немой, но кто знает :)
Edit3: вызов imageFile.path, не режет это тоже. Он просто производит
[27/Nov/2016 22:29:08] "POST /correcturl/upload/ HTTP/1.1" 200
Cleanup called
[27/Nov/2016 22:29:15] "DELETE /correcturl/upload/ HTTP/1.1" 500 37
на окне консоли. Ошибка HTTP 500 возникает из-за того, что представление не может обрабатывать вызов удаления из-за неправильного функционирования этого кода. Это то, что я использую в качестве сообщения статуса для интерфейса на этом этапе. Может быть, стоит отметить, что если я
print(p)
выход на консоли
Photo object
Не работает. См. Править номер 3. – xtrom0rt
@ xtrom0rt Хм ... интересно. Позвольте мне вернуться к вам после проверки. – xyres
Да, странно. Если я делаю instance.pk, он дает мне правильный первичный ключ для строки, поэтому мы должны иметь приличный дескриптор экземпляра объекта. Но это ведет себя странно. – xtrom0rt