ImageChooser只能显示某些尺寸的图像

时间:2018-03-27 10:07:27

标签: django wagtail

我网站的某些部分是品牌塑料,图片应该只有特定尺寸。

是否可以让ImageChooser仅显示特定尺寸的图像?

在上一个问题中,@ Alexy展示了如何使用ImageField clean方法仅允许某些图像 Can a wagtail ImageField be restricted to by image dimension

但为了更加用户友好,我希望ImageChooser首先只显示合适的图像。

2 个答案:

答案 0 :(得分:2)

您可以创建ImageChooserBlock的子类,并覆盖ChooserBlock的{​​{3}}来过滤选项字段中可用的图片:

from django import forms
from django.utils.functional import cached_property

class SmallImageChooserBlock(ImageChooserBlock):

    @cached_property
    def field(self):
        # Filter the choice field to include only images with 
        # width 100 and height 100
        return forms.ModelChoiceField(
            queryset=self.target_model.objects.filter(width=100, height=100), 
            widget=self.widget, 
            required=self._required, 
            help_text=self._help_text
        )

然后使用此块渲染该字段的内容面板。

答案 1 :(得分:0)

您可以使用Django的信号轻松装配一些东西,以便在上传图像时创建宽度/高度标记。它看起来像这样:

# signals.py
from django.db.models.signals import pre_save
from django.dispatch import receiver
from wagtail.images.models import Image


@receiver(pre_save, sender=Image)
def create_image_dimension_tags(sender, **kwargs):
    if kwargs.get('created', False):
        image = kwargs.get('instance')
        height = image.file.height
        width = image.file.width
        image.tags.create(name=f'{height}h')
        image.tags.create(name=f'{width}w')

然后,100x100图片会有一个100w标记和一个100h标记,可用于过滤上传的图像。