Форум сайта python.su
Здравствуйте.
Хочу сделать в админке возможность добавлять фотки.
Выглядеть должно примерно как то так:
Есть 2 поля. Одно - url. Второе - обычный file=input
Если я ввожу url - картинка загружается с указанного url'a. Если выбираю файл - соотв загружается с локальной машины.
Дальше нужно определить ширину, высоту и размер картинки, вычислить на основе этих и может быть ещё каких то данных путь для сохранения, сохранить и распихать все данные в таблице.
С джангой (да и с пайтоном вообщем) я знаком очень плохо, поэтому и дело продвигается очень медленно.
Подскажите как это сделать? Я так понимаю, нужно переопределить кучу методов в своей модели? Или может ещё что то нужно…
Делаю не столько с целью дальнейшего использования сколько с целью попрактиковаться.
Заранее спасибо.
Офлайн
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)
Отредактировано (Авг. 6, 2009 10:20:35)
Офлайн
ImageField не может сделать следующее:
1. созранить файл не в какой то конкретной папке - а в вычисленной динамически на основе имени файла или других параметров.
с этим я справился созданием своего Storage в котором переопределил метод get_available_name.
2. Узнать размер картинки и занести его соответсвтенно в поле size.
3. Нужно изменить форму в админке. Та что генерируется на основе модели - подходит плохо т.к. требует сразу ввести ширину, высоту, размер. И одновременно url и сам файл. А я хочу указывать либо одно либо другое.
В каком направлении копать дальше?
Офлайн
eugсмотрите библиотеку PIL
2. Узнать размер картинки и занести его соответсвтенно в поле size.
eugнепонятна задача. как это вводить либо ширину, высоту либо файл ?
3. Нужно изменить форму в админке. Та что генерируется на основе модели - подходит плохо т.к. требует сразу ввести ширину, высоту, размер. И одновременно url и сам файл. А я хочу указывать либо одно либо другое.
Отредактировано (Авг. 6, 2009 13:49:43)
Офлайн
eugЧитать документацию.
В каком направлении копать дальше?
Офлайн
как это вводить либо ширину, высоту либо файл ?не ширину и высоту, а либо URL файла - тогда файл нужно загрузить с удаленного хоста. Либо выбрать файл на локальной машине и загрузить.
Офлайн
DaevaornДельный совет ) Если честно вопрос не в реализации, а например как переопределить стандартное поведение модели. Если я сделаю минимум кода (определение модели и регистрация в админке) то форма в админке будет требовать указания всех данных (в том числе ширину и высоту, которые надо вычислять динамически).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)
Офлайн
eugЭто появляется когда man не дочитывашь.
стандартное поведение модели
Отредактировано (Авг. 22, 2009 16:13:09)
Офлайн