将 Wagtail 个人资料头像转换为 ImageRenditionField 序列化程序

Wagtail profile avatar into ImageRenditionField serializer

我想使用 ImageRenditionField 序列化来自 Wagtail 管理员的个人资料头像。 根据 的回答,我尝试了这个:

# models.py
class User(AbstractUser):

    def get_avatar(self):
        return self.wagtail_userprofile.avatar


# serializers.py
class UserSerializer(serializers.ModelSerializer):

    avatar = ImageRenditionField('width-190', source='get_avatar')
    class Meta:
        model = User
        fields = ['id', 'username', 'first_name', 'last_name', 'avatar']

我知道了:

Django Version: 3.1.4
Exception Type: AttributeError
Exception Value:    
'ImageFieldFile' object has no attribute 'get_rendition'

如何将用户头像放入ImageRenditionField?

你可以做到这一点

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = "__all__

class PersonSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    class Meta:
        model = Person
        fields = "__all__"
    avatar = serializers.SerializerMethodField("get_avatar_display")
    def get_avatar_display(self,info):
        return info.wagtail_userprofile.avatar.url

avatar 字段是一个常规的 Django ImageField。它没有 get_rendition,它没有任何 Wagtail 再现逻辑。

看看wagtail.users.models.UserProfile.avatar

class UserProfile(models.Model):
    ...

    avatar = models.ImageField(
        verbose_name=_('profile picture'),
        upload_to=upload_avatar_to,
        blank=True,
    )

wagtail.images.models.AbstractImage.file(这是WagtailImage的基础class)。

class AbstractImage(CollectionMember, index.Indexed, models.Model):
    ...
    file = models.ImageField(
        verbose_name=_('file'), upload_to=get_upload_to, width_field='width', height_field='height'
    )

注意 avatar 字段是一个常规的 Django ImageField。 Wagtail 图像是一个 模型,它存储额外的图像信息并处理滤镜、焦点和再现。

您不能将 Wagtail 演绎版与头像字段结合使用,因为头像是 Django ImageField 而不是 Wagtail 图像。

various thumbnail packages 为 Django ImageFields 提供 thumbnail/scale 功能。不要调整 UserProfile.avatar 字段本身(自定义 Wagtail)。搜索与普通 ImageFields 兼容的包。

.