Создание сайта на Django: Урок 8, вывод картинки в шаблон Django без ошибки, если ее не подгрузили
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 0

Вывод изображений в шаблон на Django

Для начала, давайте настроим папку media для сохранения наших изображений.

Перейдем в settings.py, найдем строчку

backend/settings.py

STATIC_URL = 'static/'

И сделаем так:

STATIC_URL = '/static/'
STATIC_ROOT = (BASE_DIR / 'static')

MEDIA_ROOT = (BASE_DIR / 'media')
MEDIA_URL = '/media/'

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

Но, теперь нужно добавить кое-что в главный urls.py, чтобы изображения отображались правильно

backend/urls.py

from django.conf.urls.static import static
from backend import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('modules.blog.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Поясняю:

  • Изображения в дебаг режиме будут подгружаться сервером django.
  • На деплое это делает nginx.

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

blog/models/articles.py

class Article(models.Model):
    thumbnail = models.ImageField(
        verbose_name='Превью поста',
        blank=True,
        upload_to='images/thumbnails/',
        validators=[FileExtensionValidator(
            allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))
        ]
    )
    #some fields
    
    #some methods
    
    def __str__(self):
    """
    Возвращение строки в виде заголовка статьи
    """
        return self.title
    
    @property
    def get_thumbnail(self):
        """
        Получение заглушки при отсутсвии изображения
        """
        if not self.thumbnail:
            return '/media/images/placeholder.png'
        return self.thumbnail.url

Пояснения:

  • Полный путь сохранения будет /media/images/thumbnails/
  • Также, я добавил в папку /media/images/ простую заглушку.

Теперь давайте добавим в шаблон наш метод:

templates/modules/blog/articles/article-list.html

{% extends 'main.html' %}

{% block content %}
    {% for article in articles %}
        <figure>
            <img src="{{ article.get_thumbnail }}" width="200" alt="{{ article.title }}">
        </figure>
        <strong>{{ article.title }}</strong>
        <p>{{ article.short_description }}</p>
    {% endfor %}
{% endblock %}

Пояснения:

  • Я добавил вот этот фрагмент <figure><img src="{{ article.get_thumbnail }}" alt="{{ article.title }}"></figure>

Вот что из этого вышло:

 

А так хранятся сейчас изображения:

В следующем уроке мы создадим ещё один модуль, назовем его system или core, и добавим туда функцию переименования нашего изображения, а также сохранение изображений по датам.

Но, на самом деле, вы можете поступить иначе, но в этом тоже есть некоторые свои минусы.

На самом деле, placeholder можно было установить как параметр default в нашем ImageField, а сохранение по датам, просто к пути upload_to='images/thumbnails/%Y/%m/%d/'. 

Но, мне лично нужна возможность переименовать изображение.

Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)