Концепции
Мощное приложение для управления изображениями и галереи для веб -структуры 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”