Создание нового приложения в Django

И так, в этом уроке я создам новый модуль "system", для хранения там в будущем моделей профиля, уведомлений, а также различных полезных мне функций для всего Django проекта.

В терминале:

python manage.py startapp system

И перемещаем его в нашу папку modules.

Выглядеть должно так:

  • modules
    • blog
    • system

Подключим наш системный модуль

backend/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'mptt',
    'modules.blog.apps.BlogConfig',
    'modules.system.apps.SystemConfig',
]

Переименование изображений в Django при загрузке в модели ruen

Давайте создадим такую функцию.

Для этого я создам папку services с __init__.py внутри модуля "system", а внутри папки services я создам файл utils.py

А теперь приступаем к созданию функции переименования изображения

modules/system/services/utils.py

import time
from pathlib import Path
from uuid import uuid4

from django.utils.deconstruct import deconstructible


@deconstructible
class ImageDirectorySave(object):
    """
    Класс загрузчика в определенную директорию
    """
    def __init__(self, save_path):
        self.path = save_path

    def __call__(self, instance, filename):
        ext = filename.split('.')[-1]

        if instance and hasattr(instance, 'slug'):
            filename = f'img-{instance.slug}.{ext}'
        else:
            filename = f'img-{uuid4().hex}.{ext}'
        path = Path(self.path, time.strftime('%Y/%m/%d'), filename)
        return path

Теперь его можно подключить в нашу модель Article. 

Для этого нам нужно немного изменить поле thumbnail

С этого:

modules/blog/models/articles.py

   thumbnail = models.ImageField(
        verbose_name='Превью поста',
        blank=True,
        upload_to='images/thumbnails/',
        validators=[FileExtensionValidator(
            allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))
        ]
    )

На следующий, обязательно импортировав нашу функцию

from modules.system.services.utils import ImageDirectorySave

 thumbnail = models.ImageField(
        verbose_name='Превью поста',
        blank=True,
        upload_to= ImageDirectorySave('images/thumbnails/'),
        validators=[FileExtensionValidator(
            allowed_extensions=('png', 'jpg', 'webp', 'jpeg', 'gif'))
        ]
    )

Вот кстати что получилось из переименований:

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