Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 23, 2012 13:47:21

psalexander
Зарегистрирован: 2012-04-23
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

Django начал изучать пару недель назад, а сам Python пару месяцев. Столкнулся с такой проблемой:
В базе MySQL лежат картинки(тип поля BLOB), вот эти картинки нужно отобразить на страничке. Примеры в инете есть, все по примерам сделал, но вот когда в HTML шаблоне указываю {{ img.foto.url }}, где img - имя объекта, foto - поле типа ImageField, ну а url - это по идее url. Но вместо url'а мне выдает весь файл в html страницу. Я предполагаю, что оно должно сохранить на сервер и потом выдать url, или я что-то путаю??? помогите пожалуйста, очень нада.

у меня в проекте вот так написано:

settings.py:

MEDIA_ROOT = ‘D
ADMIN_MEDIA_PREFIX = ‘/media/’
MEDIA_URL = 'http://127.0.0.1:8000/media/'


models.py:

class AnFoto(models.Model):

foto = models.ImageField(db_column='FOTO', upload_to='media', null=True, blank=True)




шаблон примерно такой:
{% for img in it.foto %}
<li><img src='{{ img.foto.url }}' />
{% endfor %}


а выдает
<li> <img src="http://127.0.0.1:8000/media/%FF%D8%FF%E0%00%10JFIF%00%01%01%00%00%01%00%01%00%00%FF%DB%00C%00%03%02%02%03%02%02%03%03%03%03%04%03%03%04%05%08%05%05%04%04%05%0A%07%07%06%08%0C%0A%0C%0C%0B%0A%0B%0B%0D%0E%12%10%0D%0E%11%0E%0B%0B%10%16%10%11%13%14%15%15%15%0C%0F%17%18%16%14%18%12%14%15%14%FF%DB ВОТ ТУТА ВЕСЬ ФАЙЛ %FF%D9" />




Офлайн

#2 Апрель 23, 2012 16:52:58

murfen
Зарегистрирован: 2012-04-23
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

ImageField не должно быть BLOBом.
Это текстовое поле, которое хранит путь к файлу относительно каталога MEDIA_ROOT
img.foto.url возвращает URL этого файла относительно MEDIA_URL
(то есть как раз возвращает MEDIA_URL + содержимое поля)

Если же у вас база “не родная”, и действительно должен использоваться BLOB, нужно искать решение, не входящее в стандарт django.
django не умеет работать с BLOB

Отредактировано murfen (Апрель 23, 2012 16:55:32)

Офлайн

#3 Апрель 23, 2012 17:43:47

psalexander
Зарегистрирован: 2012-04-23
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

база большая и ее трогать незя. Вот меня интересует че можно придумать?

Офлайн

#4 Апрель 25, 2012 10:10:59

murfen
Зарегистрирован: 2012-04-23
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

Придумать можно, как представляется, одно из двух:

1. Убрать из модели поле блоб. Все операции с блобами делать непосредственно через DB API.
https://docs.djangoproject.com/en/1.4/topics/db/sql/

2. Написать кастомное поле, представляющее наш блоб, внимательно прочитав:
https://docs.djangoproject.com/en/1.4/howto/custom-model-fields/

В обеих случаях придется вручную работать с аплоадами пользователей:
https://docs.djangoproject.com/en/1.4/topics/http/file-uploads/

Похоже, что в любом случае нет возможности избежать загрузки блоба целиком в память.

Офлайн

#5 Апрель 25, 2012 16:45:22

psalexander
Зарегистрирован: 2012-04-23
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

Короче я выкрутился немного через заднее место, но оно работает нормально(пока что)). Может существует более лучшее решение но мне, в принципе, такого хватает. Мне нужно отображать только на страничке.(Загрузку в базу осуществлять не нужно)
Тип blob у меня inspectdb определил как charfield. И я в models.py написал метод save(), который берет это поле и записывает в файл в указанную папку(работа с файлами осуществляется стандартными функциями). Также создал переменную, в которой сохраняю путь к файлу. При работе в файле views.py нужно только будит дополнительно для каждой переменной этой модели вызывать метод save(). После сохранения к каждой картинке имеется путь, который я указываю в хтмл.
Может это криво, и можно сделать лучше… может, вернее скорее всего. но пока не нашел. Если есть решения по лучше пишите сюда, может кому-нибудь это поможет.

Офлайн

#6 Апрель 25, 2012 16:46:12

psalexander
Зарегистрирован: 2012-04-23
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

Если нужно кому подробное описание напишите мне, я отвечу

Офлайн

#7 Апрель 25, 2012 21:03:18

murfen
Зарегистрирован: 2012-04-23
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

psalexander
Тип blob у меня inspectdb определил как charfield. И я в models.py написал метод save(), который берет это поле и записывает в файл в указанную папку(работа с файлами осуществляется стандартными функциями)
Если это уже работает, значит возможные проблемы с перекодировкой Вы решили

Дело за малым: вместо сохранения во временный файл - записывать непосредственно в HttpResponse. Получится view, которая отдает пользователю непосредственно картинки по ключу в параметрах.

Останется только решить вопрос с тем, как не загружать из базы в память блобы каждый раз, получая экземпляр модели.

Офлайн

#8 Апрель 26, 2012 11:34:58

psalexander
Зарегистрирован: 2012-04-23
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите c ImageField

Дурак я! можно не загружать. разобрался уже как. все оказывается на много проще. как будит время напишу сюда как оно выглядит

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version