Как добавить картинки в шаблон и админку Django приложения.

    blazer |   19.01.2016 |   12:10:13 |   Django |

django imagefieldНаконец то разобрался, как выводить изображения в шаблон сайта и выводить в админку миниатюру картинки.

После нескольких дней танцев с бубном было найдено решение проблемы.

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

 


Добавляем в вашу модель поле imagefield

    image = models.ImageField(blank=True, upload_to='images/blog/%Y/%m/%d', help_text='150x150px', verbose_name='Ссылка картинки')

В settings.py настраиваем пути.

MEDIA_URL = '/static/media/'
STATIC_ROOT = 'D:/OpenServer/domains/mysite/static/'
MEDIA_ROOT = 'D:/OpenServer/domains/mysite/static/media/'

В моем случае я решил, что картинки будут находится в каталоге /static/media/. Как видим в моей модели я указал для приложения Блог каталог /blog/ таким образом все картинки для блога будут собираться в этом каталоге и он будет иметь такой  путь /static/media/images/blog/год/месяц/день/ и вид как на картинке

Думаю понятно, куда лягла картинка python.png. Для меня это очень удобно такое расположение картинок - типа фильтра.

Далее идем в свой шаблон и выводим картинку таким образом. Тут вы подставляете свою переменну у меня это - te, вы ставите свою, которую указали в views.py для передачи в контекст шаблона своего приложения!

        {% if te.image %}
        <img src="{{ MEDIA_URL }}{{ te.image }}">
        {% endif %}

Если не заработало, то попробуйте добавить url

        {% if te.image %}
        <img src="{{ MEDIA_URL }}{{ te.image.url }}">
        {% endif %}

Все, теперь у вас должны отображаться картинки на сайте!

Давайте теперь попробуем вывести миниатюры картинок в админку сайта, чтобы было видно к какой новости добавлена картинка.

В наш файл models.py добавляем этот код.

    def image_img(self):
        if self.image:
            return u'<a href="{0}" target="_blank"><img src="{0}" width="100"/></a>'.format(self.image.url)
        else:
            return '(Нет изображения)'
    image_img.short_description = 'Картинка'
    image_img.allow_tags = True

В этом коде вы ставите свою переменну (название вашего поля imagefield) в моем случае это - image.

В Django 2 нужно импортировать функцию mark_safe() и обернуть в нее эту строку

return mark_safe(u'<a href="{0}" target="_blank"><img src="{0}" width="100"/></a>'.format(self.images.url)) иначе вместо картинки будет выведен html код картинки!

    # Вывод картинок в админке!
    def image_img(self):
        if self.images:
            from django.utils.safestring import mark_safe
            return mark_safe(u'<a href="{0}" target="_blank"><img src="{0}" width="100"/></a>'.format(self.images.url))
        else:
            return '(Нет изображения)'
    image_img.short_description = 'Картинка'
    image_img.allow_tags = True

Открываем файл admin.py и выводим в нем image и image_img. Я сделал это так.

list_display = ['title', 'category', 'likes', 'dislikes', 'slug', 'image', 'image_img', 'timestamp', 'autor']
readonly_fields = ['image_img',]
fields = ['category', 'title', 'slug', 'metakey', 'metadesc', 'text_redactor', 'text_redactor_full', 'tag', 'timestamp', 'autor', 'image', 'image_img', 'body', 'likes', 'dislikes']

Теперь у вас должны отображаться миниатюры картинок в админке! У меня это выглядит примерно так.

Видео:

Подсказку нашел тут и тут

Ваши комментарии

Комментарии могут оставлять только зарегистрированые пользователи!

Disqus - комментарии

blog comments powered by Disqus