Форум сайта python.su
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" />
Офлайн
ImageField не должно быть BLOBом.
Это текстовое поле, которое хранит путь к файлу относительно каталога MEDIA_ROOT
img.foto.url возвращает URL этого файла относительно MEDIA_URL
(то есть как раз возвращает MEDIA_URL + содержимое поля)
Если же у вас база “не родная”, и действительно должен использоваться BLOB, нужно искать решение, не входящее в стандарт django.
django не умеет работать с BLOB
Отредактировано murfen (Апрель 23, 2012 16:55:32)
Офлайн
база большая и ее трогать незя. Вот меня интересует че можно придумать?
Офлайн
Придумать можно, как представляется, одно из двух:
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/
Похоже, что в любом случае нет возможности избежать загрузки блоба целиком в память.
Офлайн
Короче я выкрутился немного через заднее место, но оно работает нормально(пока что)). Может существует более лучшее решение но мне, в принципе, такого хватает. Мне нужно отображать только на страничке.(Загрузку в базу осуществлять не нужно)
Тип blob у меня inspectdb определил как charfield. И я в models.py написал метод save(), который берет это поле и записывает в файл в указанную папку(работа с файлами осуществляется стандартными функциями). Также создал переменную, в которой сохраняю путь к файлу. При работе в файле views.py нужно только будит дополнительно для каждой переменной этой модели вызывать метод save(). После сохранения к каждой картинке имеется путь, который я указываю в хтмл.
Может это криво, и можно сделать лучше… может, вернее скорее всего. но пока не нашел. Если есть решения по лучше пишите сюда, может кому-нибудь это поможет.
Офлайн
Если нужно кому подробное описание напишите мне, я отвечу
Офлайн
psalexanderЕсли это уже работает, значит возможные проблемы с перекодировкой Вы решили
Тип blob у меня inspectdb определил как charfield. И я в models.py написал метод save(), который берет это поле и записывает в файл в указанную папку(работа с файлами осуществляется стандартными функциями)
Офлайн
Дурак я! можно не загружать. разобрался уже как. все оказывается на много проще. как будит время напишу сюда как оно выглядит
Офлайн