2016-11-27 4 views
0

Я делаю небольшую часть программного обеспечения с 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 

ответ

0

Я знал, что должен был сделать что-то глупое и, наконец, успел вернуться к отладке.

На мой взгляд, я бы сделал

deletable = Photo(id=id) 

вместо

deletable = Photo.objects.get(id=id) 

, таким образом, в конечном итоге с новым объектом фото с только поле идентификатора заполненным. Поскольку Photo.save() был никогда не называемый, это не закончилось в моей БД и ошибок не было. Из-за этого ошибка исчезла под моим радаром.

Таким образом, когда, наконец, вызывая

deletable.delete() 

это только удалили экземпляр незавершенного я только что создали. Хотя, он также удалил надлежащую запись из БД. Это то, что отбросило меня и заставил меня в основном искать в другом месте проблему, думая, что у меня есть правильный объект базы данных в моих руках.

Откуда это поведение осталось неясным для меня. Действительно ли delete() проверяет базу данных для идентификатора (который он в этом случае нашел бы) вместо того, чтобы обрабатывать данный экземпляр? Я думаю, что взглянуть на django.db.models.Model.delete() может пролить свет на это.

0

Если вам необходим путь изображения, попробуйте:

path = p.imageField.path 

PS : Да, вы должны следовать конвенции. В противном случае другим будет сложно прочитать ваш код, если вы поделитесь им с кем-то или внесите свой вклад в проект с открытым исходным кодом или нанимаете программистов в вашей компании и т. Д.

+0

Не работает. См. Править номер 3. – xtrom0rt

+0

@ xtrom0rt Хм ... интересно. Позвольте мне вернуться к вам после проверки. – xyres

+0

Да, странно. Если я делаю instance.pk, он дает мне правильный первичный ключ для строки, поэтому мы должны иметь приличный дескриптор экземпляра объекта. Но это ведет себя странно. – xtrom0rt

Смежные вопросы