Рубрики
Без рубрики

Фотолог: Хорошее управление изображениями для Django с интеграцией DRF

Концепции Мощное приложение управления изображениями и галереи для веб -структуры Django …. С тегом Джанго, Python, WebDev, OpenSource.

Концепции

Мощное приложение для управления изображениями и галереи для веб -структуры Django. Загрузите фотографии, группируйте их в галереи, применяйте такие эффекты, как водяные знаки.

Зависимости

  • Джанго.
  • Подушка.
  • Django-sortedm2m. (Автоматически установлен с помощью django-photologue)

Монтаж

Самый простой способ установить фотолог – с PIP; Это даст вам последнюю версию, доступную на PYPI:

pip install django-photologue

Начиная

Предварительные условия

Убедитесь, что вы установили Media_url и Media_root в настройка.py :

#settings.py

MEDIA_URL = /media/
MEDIA_ROOT = /data/media/

Конфигурация

1) Добавить фотолог , SortedM2m , django.contrib.sites в Insted_apps и Site_id = 1 Анкет

#settings.py
SITE_ID = 1

INSTALLED_APPS = [
     ...

    'django.contrib.sites',

    # Django Image Library - Photologue
    'photologue',
    'sortedm2m',
]

2) Применить миграцию фотологов

python manage.py migrate photologue

3) Зарегистрировать URL -адреса фотологов в urls.py

urlpatterns = [
    ...
    # Photologue Urls
    path('photologue/', include('photologue.urls', namespace='photologue')),
]

Модели

Добавьте фотолоковое фото фото в свою модель:

image = models.ForeignKey(
    'photologue.Photo',
    null=True,
    blank=True,
    on_delete=models.SET_NULL,
)

Затем примените миграции.

python manage.py makemigrations
python manage.py migrate

Пример модели:

class BlogPost(models.Model):
    uuid = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        help_text="The uuid4 primary key of the post",
    )
    title = models.CharField(
        max_length=255,
        help_text="The title of the post",
    )
    content = models.TextField(
        blank=True,
        help_text="The content of the post",
    )
    publishers = models.ManyToManyField(
        'auth.User',
        related_name='posts',
        help_text="The maintainers of the pods",
    )
    preview_image = models.ForeignKey(
        'photologue.Photo',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        help_text="The preview image of the appx",
    )

    def __str__(self):
        return f'Appx: {self.name}'

Галерея

Вы можете добавить поле галереи, которое представляет собой M2M фото -поля.

gallery = models.ForeignKey(
    'photologue.Gallery',
    null=True,
    blank=True,
    on_delete=models.SET_NULL,
)

Размеры фотографий

Перейдите в интерфейс администратора Django, затем вы можете создать новые экземпляры Photo Dize. Когда будет создан экземпляр фотографии, для каждого размера фотографий будет создано изображение с автоматическим сжатием урожая и качества.

Вот примеры размеров фотографий:

  • Миниатюра (100 x 100)
  • маленький (320 х 200)
  • Средний (640 x 400)
  • большой (960 х 600)

Аксессов

Основой фотолога является модель фото. При создании экземпляра методы будут автоматически добавлены для получения фотографий на различных фотосессиях. Например. Если у вас есть экземпляр фотографии, называемый изображением, то следующие методы будут добавлены автоматически:

preview_image.get_small_url()
preview_image.get_medium_url()
preview_image.get_large_url()
preview_image.get_raw_url()

Их можно использовать в пользовательском шаблоне для отображения миниатюры, например:

Утилит

Вот функция, которая принимает изображение и создает экземпляр фотографии:

from datetime import datetime
from django.utils.text import slugify
from photologue.models import Photo


def create_photo(image):
    title = f'{datetime.now()}'
    slug = slugify(title)
    photo = Photo.objects.create(
        title=title,
        slug=slug,
        image=image,
    )
    return photo

Интеграция DRF

Микшины

Вы можете определить этот метод create_mixin_image_serializer () который создает миксериализатор на основе названия поля изображения.

from rest_framework import serializers
from photologue.models import PhotoSize
from collections import OrderedDict


def _get_image_factory(image_field_name, photo_size):
    def get_image(self, obj):
        request = self.context['request']
        if request and hasattr(obj, image_field_name):
            image = getattr(obj, image_field_name)
            if image is not None:
                get_url_method = getattr(image, f'get_{photo_size}_url')
                url = get_url_method()
                return request.build_absolute_uri(url)
        return None
    return get_image


def create_mixin_image_serializer(image_field_name):
    photo_sizes = PhotoSize.objects\
        .filter(id__gte=3)\
        .values_list('name', flat=True)

    class ImageSerializerMixin(serializers.ModelSerializer):
        pass

    ImageSerializerMixin._declared_fields = OrderedDict([
        (f'{image_field_name}_{photo_size}', serializers.SerializerMethodField())
        for photo_size in photo_sizes
    ])

    for photo_size in photo_sizes:
        setattr(
            ImageSerializerMixin,
            f'get_{image_field_name}_{photo_size}',
            _get_image_factory(image_field_name, photo_size),
        )
    return ImageSerializerMixin

Сериализаторы

1) Вы можете оснастить сериализатор изображения с микшином с полем preview_image :

PreviewImageSerializerMixin = create_mixin_image_serializer('preview_image')

В противном случае вы можете вручную создать сериализатор Mixin Image:

class PreviewImageSerializerMixin(serializers.ModelSerializer):
    preview_image_small = serializers.SerializerMethodField()
    preview_image_medium = serializers.SerializerMethodField()
    preview_image_large = serializers.SerializerMethodField()
    preview_image_raw = serializers.SerializerMethodField()

   def get_preview_image_small(self, obj):
       request = self.context['request']
       if request and hasattr(obj, 'preview_image'):
           image = getattr(obj, 'preview_image')
           if image is not None:
               url = image.get_small_url()
               return request.build_absolute_uri(url)
       return None

   def get_preview_image_medium(self, obj):
       request = self.context['request']
       if request and hasattr(obj, 'preview_image'):
           image = getattr(obj, 'preview_image')
           if image is not None:
               url = image.get_medium_url()
               return request.build_absolute_uri(url)
       return None

   def get_preview_image_large(self, obj):
       request = self.context['request']
       if request and hasattr(obj, 'preview_image'):
           image = getattr(obj, 'preview_image')
           if image is not None:
               url = image.get_large_url()
               return request.build_absolute_uri(url)
       return None

   def get_preview_image_raw(self, obj):
       request = self.context['request']
       if request and hasattr(obj, 'preview_image'):
           image = getattr(obj, 'preview_image')
           if image is not None:
               url = image.get_raw_url()
               return request.build_absolute_uri(url)
       return None

2) Вот пример сериализатора:

class BlogPostSerializer(PreviewImageSerializerMixin):
    """
    Serializer for BlogPost instance
    """
    class Meta:
        model = BlogPost
        fields = ('uuid', 'title', 'content',
                  'preview_image_small', 'preview_image_medium',
                  'preview_image_large', 'preview_image_raw')

3) Определить create () и Update () В случае загрузки изображения:

    def create(self, validated_data):
        preview_image = validated_data.pop('preview_image', None)
        instance = super(BlogPostSerializer, self).create(validated_data)

        # Save image field
        if preview_image:
            instance.preview_image = create_photo(preview_image)

        instance.save()
        return instance

    def update(self, instance, validated_data):
          preview_image = validated_data.pop('preview_image', None)
        instance = super(BlogPostSerializer, self).update(instance, validated_data)

        # Update image field
        if preview_image:
            instance.preview_image = create_photo(preview_image)

        instance.save()
        return instance

Примечания для производства

Вы должны интегрировать библиотеку фотологов шаг за шагом.

1) Установите пакет.

pip install django-photologue

2) Добавить фотолог , SortedM2m , django.contrib.sites в Insted_apps

INSTALLED_APPS = [
     ...

    'django.contrib.sites',

    # Django Image Library - Photologue
    'photologue',
    'sortedm2m',
]
python manage.py migrate photologue

3) Применить миграцию фотологов

python manage.py migrate photologue

4) Если вы хотите заменить Imagefield на фотографию в ваших моделях.py, вы должны выполнить эти шаги:

  • Удалить Imagefield в своих моделях.py
  • Применить миграции
  • Добавить фото в свои модели.py
  • Применить миграции

Если вы хотите сохранить свои изображения, вы должны сохранить два поля:

  • Добавить фото в свои модели.py
  • Применить миграции
  • Инстачарует фото
  • Удалить Imagefield в своих моделях.py
  • Применить миграции

Ссылки

Оригинал: “https://dev.to/javidjms/photologue-nice-image-management-for-django-with-drf-integration-6o9”