Найти - Пользователи
Полная версия: Загрузить картинку, узнать размер и габариты, сохранить...
Начало » Django » Загрузить картинку, узнать размер и габариты, сохранить...
1
eug
Здравствуйте.

Хочу сделать в админке возможность добавлять фотки.
Выглядеть должно примерно как то так:
Есть 2 поля. Одно - url. Второе - обычный file=input
Если я ввожу url - картинка загружается с указанного url'a. Если выбираю файл - соотв загружается с локальной машины.
Дальше нужно определить ширину, высоту и размер картинки, вычислить на основе этих и может быть ещё каких то данных путь для сохранения, сохранить и распихать все данные в таблице.
С джангой (да и с пайтоном вообщем) я знаком очень плохо, поэтому и дело продвигается очень медленно.

Подскажите как это сделать? Я так понимаю, нужно переопределить кучу методов в своей модели? Или может ещё что то нужно…
Делаю не столько с целью дальнейшего использования сколько с целью попрактиковаться.

Заранее спасибо.
pochechyev
http://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield


а для определение параметров изображение использовать PIL (Python Image Library)

если задача стоит изменить размер изображения то Вам необходимо переопределить метод save() для модели

приблизительно так:
def save(self, *args, **kwargs):
super(ImageFile,self).save(*args, **kwargs)

t_img=Image.open(self.file.path)
t_img.thumbnail(self.thumbnail_size, Image.ANTIALIAS)
t_img.save(self.file.path+"thumb.jpg")
img=Image.open(self.file.path)
img.thumbnail(self.img_size, Image.ANTIALIAS)
img.save(self.file.path)
eug
ImageField не может сделать следующее:
1. созранить файл не в какой то конкретной папке - а в вычисленной динамически на основе имени файла или других параметров.
с этим я справился созданием своего Storage в котором переопределил метод get_available_name.
2. Узнать размер картинки и занести его соответсвтенно в поле size.
3. Нужно изменить форму в админке. Та что генерируется на основе модели - подходит плохо т.к. требует сразу ввести ширину, высоту, размер. И одновременно url и сам файл. А я хочу указывать либо одно либо другое.
В каком направлении копать дальше?
pochechyev
eug
2. Узнать размер картинки и занести его соответсвтенно в поле size.
смотрите библиотеку PIL
eug
3. Нужно изменить форму в админке. Та что генерируется на основе модели - подходит плохо т.к. требует сразу ввести ширину, высоту, размер. И одновременно url и сам файл. А я хочу указывать либо одно либо другое.
непонятна задача. как это вводить либо ширину, высоту либо файл ?
Александр Кошелев
eug
В каком направлении копать дальше?
Читать документацию.
eug
как это вводить либо ширину, высоту либо файл ?
не ширину и высоту, а либо URL файла - тогда файл нужно загрузить с удаленного хоста. Либо выбрать файл на локальной машине и загрузить.
eug
Daevaorn
eug
В каком направлении копать дальше?
Читать документацию.
Дельный совет ) Если честно вопрос не в реализации, а например как переопределить стандартное поведение модели. Если я сделаю минимум кода (определение модели и регистрация в админке) то форма в админке будет требовать указания всех данных (в том числе ширину и высоту, которые надо вычислять динамически).
Вот давайте на примере ширины и высоты пока. Как сделать чтобы эти поля не выводились и соотв не валидировались, а заполнялись только самим ImageField?
eug
Немного поковырял доку, немного погуглил. Вот на чем застрял. Убрал весь лишний код чтобы не мешало.
Оставил просто поле ввода url. Нужно загрузить этот файл и сохранить обьект в базе.

class HttpImage(models.Model):
url = models.CharField(max_length=255, blank=True)
file = models.FileField(upload_to='i', editable=False)

def save(self, *args, **kwargs):
filename = tempfile.mktemp()
urllib.urlretrieve(self.url, filename)

# проблемма в этом месте. Что нужно сделать чтобы в self.file были
# правильные данные и после вызова save файл скопировался в нужное место
# и обьект сохранился в базу.

super(HttpImage, self).save(*args, **kwargs)
romankrv
eug
стандартное поведение модели
Это появляется когда man не дочитывашь.
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