Найти - Пользователи
Полная версия: Помогите c ImageField
Начало » Django » Помогите c ImageField
1
psalexander
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" />




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

Если же у вас база “не родная”, и действительно должен использоваться BLOB, нужно искать решение, не входящее в стандарт django.
django не умеет работать с BLOB
psalexander
база большая и ее трогать незя. Вот меня интересует че можно придумать?
murfen
Придумать можно, как представляется, одно из двух:

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/

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

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

Останется только решить вопрос с тем, как не загружать из базы в память блобы каждый раз, получая экземпляр модели.
psalexander
Дурак я! можно не загружать. разобрался уже как. все оказывается на много проще. как будит время напишу сюда как оно выглядит
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