【问题标题】:Wagtail profile avatar into ImageRenditionField serializer鹡鸰个人资料头像进入 ImageRenditionField 序列化程序
【发布时间】:2020-12-31 19:39:37
【问题描述】:

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

# 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?

【问题讨论】:

  • 我检查了用户配置文件的源代码,它不是从AbstractImage 模型继承的,这意味着您不会有get_rendition 可用于此图像。你可以在你的序列化方法中调整大小

标签: django serialization django-rest-framework wagtail


【解决方案1】:

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(这是Wagtail Image的基类)。

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 演绎版与 avatar 字段结合使用,因为 avatar 是 Django ImageField 而不是 Wagtail Image。

various thumbnail packages 为 Django ImageFields 提供缩略图/缩放功能。不要调整 UserProfile.avatar 字段本身(自定义 Wagtail)。搜索与普通 ImageField 搭配得很好的包。

This question and answer might interest you.

【讨论】:

    【解决方案2】:

    你可以这样做

    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
    

    【讨论】:

    • 你的意思是获取头像的url吗?是的,这行得通。但我想要的是将头像放入 ImageRenditionField 并能够裁剪或调整头像。
    • 你可以安装django-resized
    猜你喜欢
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    相关资源
    最近更新 更多