ImageChooser 只能显示特定尺寸的图像吗

Can an ImageChooser only show images of certain dimensions

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

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

在之前的问题中,@Alexy 展示了如何使用 ImageField clean 方法来仅允许某些图像

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

您可以使用 Django 的信号非常轻松地组装一些东西,以便在您上传图像时创建 width/height 标签。它看起来像这样:

# 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 标签,您可以使用它们来过滤上传的图片。

您可以创建 ImageChooserBlock 的子类,并覆盖 ChooserBlockfield property 以过滤选择字段中可用的图像:

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
        )

然后使用此块呈现该字段的内容面板。