Хорошо, я пробовал почти все, и я не могу заставить это работать.
- У меня есть модель Django с ImageField на нем
- У меня есть код, который загружает изображение через HTTP (проверено и работает)
- Изображение сохраняется непосредственно в папку upload_to (то, что загружено в папку ImageField)
- Все, что мне нужно сделать, это связать уже существующий путь к файлу изображения с ImageField
Я написал этот код около 6 разных способов.
Проблема, с которой я сталкиваюсь, заключается в том, что весь код, который я пишу, приводит к следующему поведению: (1) Django создаст второй файл, (2) переименует новый файл, добавив _ в конец файла имя, то (3) не передавать какие-либо данные, оставляя в основном пустой файл с переименованным именем. В пути «upload_to» осталось 2 файла, один из которых является фактическим изображением, а другой - именем изображения, но пустым, и, конечно, путь ImageField установлен на пустой файл, который пытается создать Django. ,
Если это неясно, я попытаюсь проиллюстрировать:
## Image generation code runs....
/Upload
generated_image.jpg 4kb
## Attempt to set the ImageField path...
/Upload
generated_image.jpg 4kb
generated_image_.jpg 0kb
ImageField.Path = /Upload/generated_image_.jpg
Как я могу сделать это без попытки Django повторно сохранить файл? Что мне действительно нравится, так это что-то в этом роде ...
model.ImageField.path = generated_image_path
... но, конечно, это не работает.
И да, я рассмотрел другие вопросы, такие как этот, а также документ django в файле
ОБНОВЛЕНИЕ После дальнейшего тестирования, это происходит только при работе под Apache на Windows Server. Во время работы под «runserver» в XP он не выполняет это поведение.
Я в тупике.
Вот код, который успешно работает на XP ...
f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()
источник
Ответы:
У меня есть код, который выбирает изображение из Интернета и сохраняет его в модели. Важные биты:
Это немного сбивает с толку, потому что это извлечено из моей модели и немного вне контекста, но важными частями являются:
Дайте мне знать, если у вас есть вопросы или вам нужны разъяснения.
Изменить: для ясности, вот модель (за вычетом любых требуемых операторов импорта):
источник
import urlparse
,os.path.basename(urlparse.urlparse(self.url).path)
, Спасибо за пост, было полезно.prohibited to prevent data loss due to unsaved related object 'stream'.
Очень просто, если модель еще не создана:
Сначала скопируйте файл изображения в путь загрузки (предполагается, что в следующем фрагменте = «путь /» ).
Во-вторых , используйте что-то вроде:
протестировано и работает в django 1.4, оно может работать и для существующей модели.
источник
Просто небольшое замечание. tvon answer работает, но, если вы работаете с Windows, вы, вероятно, захотите
open()
файл с'rb'
. Как это:или вы получите свой файл урезанным в первом
0x1A
байте.источник
Вот метод, который хорошо работает и позволяет также преобразовать файл в определенный формат (чтобы избежать ошибки «невозможно записать режим P как JPEG»):
где image - это django ImageField или your_model_instance.image. Вот пример использования:
Надеюсь это поможет
источник
Хорошо, если все, что вам нужно сделать, это связать уже существующий путь к файлу изображения с ImageField, то это решение может быть полезным:
Что ж, если честно, уже существующий файл изображения не будет связан с ImageField, но копия этого файла будет создана в upload_to dir как «imgfilename.jpg» и будет связана с ImageField.
источник
with open('/path/to/already/existing/file', 'rb') as f:
obj.save()
Я создал собственное хранилище, которое не будет сохранять файл на диск:
Затем в моих моделях для моего ImageField я использовал новое пользовательское хранилище:
источник
Если вы хотите просто «установить» фактическое имя файла, не неся при этом затрат на загрузку и повторное сохранение файла (!!) или прибегая к использованию поля char (!!!), вы можете попробовать что-то вроде этого - -
Это осветит ваш model_instance.myfile.url и все остальные, как если бы вы действительно загрузили файл.
Как говорит @ t-stone, мы действительно хотим установить instance.myfile.path = 'my-filename.jpg', но в настоящее время Django этого не поддерживает.
источник
Самое простое на мой взгляд решение:
источник
Многие из этих ответов устарели, и я провел много часов в отчаянии (я довольно новичок в Django & web dev в целом). Тем не менее, я нашел эту превосходную идею @iambibhas: https://gist.github.com/iambibhas/5051911
источник
Возможно, это не тот ответ, который вы ищете. но вы можете использовать charfield для хранения пути к файлу вместо ImageFile. Таким образом, вы можете программно связать загруженное изображение с полем без воссоздания файла.
источник
Можешь попробовать:
источник
источник
источник
Работает! Вы можете сохранить изображение с помощью FileSystemStorage. проверьте пример ниже
источник
Вы можете использовать Django REST Framework и библиотеку Python Requests для программного сохранения изображения в Django ImageField.
Вот пример:
источник
С Django 3, с такой моделью, как эта:
если изображение уже было загружено, мы можем напрямую сделать:
или
источник