#django #django-models #thumbnails
#django #django-модели #эскизы
Вопрос:
Я хочу создать эскизы для загруженных изображений. Я знаю, что есть несколько доступных библиотек, но у меня есть очень базовые потребности, и я бы предпочел сделать это самостоятельно.
Моя модель выглядит следующим образом:
from image_tools import resize
class Photo(models.Model):
# some fields
image = models.ImageField(
upload_to='images',
height_field='height',
width_field='width'
)
thumb = models.ImageField(
upload_to='thumbs',
editable=False
)
def save(self):
self.thumb = self.image
resize(self.image.path, self.thumb.path, 50, 40)
super(Photo, self).save()
Вот resize()
написанная мной простая функция, которая принимает в качестве аргументов исходный путь к файлу, путь назначения и размеры и сохраняет миниатюру. Единственная проблема заключается в том, что на данный момент файла еще нет на диске.
Есть ли способ принудительно сохранить сам файл в его местоположении, чтобы он был доступен моей функции?
Пожалуйста, не стесняйтесь предлагать лучшие способы решения этого вопроса. Тем не менее, я хотел бы знать, как обрабатывать файлы, которые еще не сохранены, каким бы ни оказалось лучшее решение.
Ответ №1:
Есть несколько способов сделать это. Если у вас есть необработанные данные изображения, вы можете довольно легко записать их в файл (посмотрите раздел Загрузка файла django, чтобы узнать, как сохранить загруженный файл на диск). Вы можете прочитать любой файл, к которому имеет доступ ваш процесс django (или apache), а не только путь к вашему экземпляру django.
Еще одна вещь, которую вы можете сделать перед сохранением этого, — использовать PIL для создания миниатюр изображения и сохранения его:
http://effbot.org/imagingbook/image.htm
Вы также можете загрузить данные в s3 с помощью boto s3, если хотите, чтобы изображения размещались на CDN.
Комментарии:
1. Я прочитал загрузку файла django, и я не нашел ответа на свой вопрос. Не могли бы вы выразиться немного конкретнее? «Как только у вас будут необработанные данные изображения, вы можете довольно легко записать их в файл» — это именно то, о чем я спрашиваю, как это сделать.
Ответ №2:
Сохранение файла напрямую не является хорошей идеей, потому что вы игнорируете файловое хранилище по умолчанию (т. Е. файловую систему, amazon s3, …)
Лучший подход — использовать класс файла django
from django.core.files import File
# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
... myfile = File(f)
... myfile.write('Hello World')
Также для удаления файла используйте класс хранилища по умолчанию
Смотрите ссылку ниже для получения более подробной информации
https://docs.djangoproject.com/en/1.5/topics/files /