我网站的某些部分是品牌塑料,图片应该只有特定尺寸。
是否可以让ImageChooser仅显示特定尺寸的图像?
在上一个问题中,@ Alexy展示了如何使用ImageField clean方法仅允许某些图像 Can a wagtail ImageField be restricted to by image dimension
但为了更加用户友好,我希望ImageChooser首先只显示合适的图像。
答案 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
标记,可用于过滤上传的图像。