Найти - Пользователи
Полная версия: ImageField - удаление файлов
Начало » Django » ImageField - удаление файлов
1
куиуд
Я создаю ImageField в моей модели

uploaded_icon = models.ImageField(upload_to = ‘images/user_icons/’, blank = True, null = True)

Я хочу сделать так, чтобы когда пользователь загружает картинку, а картинка с таким именем уже есть, она заменялась на ту, которую загружает ползователь. Позволяет ли ImageField сделать это, и если да, то как, или как это можно сделать другими средствами?
Ferroman
Ммм. Тут есть некоторая логическая проблема.
1. Пользователь загрузил картинку с именем 1.bmp. В базе создалась запись №1, картинка записалась в папку.
Без изменений:
2. Пользователь загружает картинку с таким же именем. В базе создалась запись №2, картинка записалась в папку.
Так, как выхотите:
2. Пользователь загружает картинку с таким же именем. В базе создалась запись №2, картинка перезаписала картинку в папке. Теперь запись #1 b #2 ссылаются на одно и то же изображение. Тут, надо сказать, будут очень трудно находимые проблемы.
Не говоря о том, что теперь при удалении любой записи - или №1 или №2 картинка будет удалятся вместе с ней. Что, в свою очередь, значит, что запись, которая останется, будет ссылатся на несуществующий файл.

Я не знаю, какую вы задачу решаете, но мне кажется что такая замена - не очень хорошая идея.
Скорее имеет смысл проверять есть ли такой файл, и если есть - не добавлять новую запись, а редактировать существующюю.

Как это сделать?
Использовать кастомные методы вместо стандартных методов моеделей.
куиуд
я решаю проблему с загрузкой аватарок. А файл руками переименовываю, т.е. для юзера аватара лежит всегда с одним и тем же именем. А почему запись №2 в базе будет создаваться?
Ferroman
я решаю проблему с загрузкой аватарок. А файл руками переименовываю, т.е. для юзера аватара лежит всегда с одним и тем же именем.
Руками, это как?
А почему запись №2 в базе будет создаваться?
Потому что вы ее добавляете, как я понял из вопроса.
Что бы не создавалась новая запись нужно использовать или свой save, или метод update() (если одновременно обновить нужно много записей).
Например с помощью get_or_create - получите или существующюю запись, и ее отредактируете, или создадите новую…
Честно говоря я немного запутался в самой задаче. Вы бы дали саму модель, было бы понятнее что именно вы хотите сделать.
куиуд
Это поле модели:
uploaded_icon = models.ImageField(upload_to = ‘images/user_icons/’, blank = True, null = True)

Попробую описать задачу немного по другому. Пользователь загружает картинку. Эта картинка переименовывается (имя вида id_< Id юзера>) и складывается в images/user_icons/. Если пользователь хочет сменить аватару, он повторно загружает картинку. При этом его старая аватара должна удалится, а новая записатся на ее место.
куиуд
Мне тут попалась такая строка в доке:

dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls)

Не могу понять что она делает
Александр Кошелев
куиуд
Не могу понять что она делает
Цепляет обработчик (где файлы подчищаются) к сигналу удаления объекта.
куиуд
Может имеет смысл использовать его для решения моей проблемы?
Александр Кошелев
куиуд
Может имеет смысл использовать его для решения моей проблемы?
В той форме, в которой вы описали свою проблему, это вам не поможет её решить. Это немного другая степь. Вам надо смотреть метод `_save_FIELD_file` у модели
куиуд
Так и сделаю. Спасибо за помощь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB