You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Wagtail的ModelViewSet中实现缩略图展示?

如何在Wagtail的ModelViewSet中实现缩略图展示?

嘿,这个问题我之前也碰到过,毕竟ModelAdmin的ThumbnailMixin下架之后确实有点不习惯,不过咱们完全可以自己动手搞定,有两个亲测有效的方案,给你参考!

方法一:自定义缩略图列类

这个方法比较灵活,适合需要在多个ViewSet里复用的场景。我们可以自己写一个支持缩略图的列类,就像原来的ThumbnailMixin那样:

from wagtail.admin.ui.tables import Column
from wagtail.images.models import Image
from django.utils.html import format_html

class ThumbnailColumn(Column):
    def __init__(self, image_field_name, rendition_spec='fill-50x50', **kwargs):
        super().__init__(**kwargs)
        self.image_field_name = image_field_name  # 模型中图片字段的名称
        self.rendition_spec = rendition_spec  # 缩略图规格,可自定义

    def render_cell(self, instance, table):
        # 获取当前实例的图片对象
        image = getattr(instance, self.image_field_name, None)
        if isinstance(image, Image):
            # 生成指定规格的图片缩略图
            rendition = image.get_rendition(self.rendition_spec)
            return format_html(
                '<img src="{}" alt="缩略图" style="max-width: 50px; max-height: 50px; border-radius: 4px;">',
                rendition.url
            )
        # 如果没有图片,返回空内容
        return ''

接下来,把这个自定义列加到你的NewsPostViewSet的list_display里就行了,记得替换成你模型里实际的图片字段名:

class NewsPostViewSet(ModelViewSet):
    model = NewsPost
    list_display = [
        ThumbnailColumn('image', label='缩略图'),  # 这里的'image'要改成你的NewsPost模型里的图片字段名
        "title", "category", "date_start", "date_end", "live"
    ]
    add_to_admin_menu = True
    icon = "calendar-alt"
    menu_label = "News"

方法二:在模型中添加缩略图方法

如果只是单个模型需要这个功能,也可以直接在NewsPost模型里加一个自定义方法,返回缩略图的HTML代码:

from django.db import models
from wagtail.images.models import Image
from django.utils.html import format_html

class NewsPost(models.Model):
    # 你的其他字段...
    title = models.CharField(max_length=255)
    category = models.ForeignKey('Category', on_delete=models.CASCADE)
    image = models.ForeignKey(Image, on_delete=models.SET_NULL, null=True, blank=True, related_name='+')
    date_start = models.DateField()
    date_end = models.DateField()
    live = models.BooleanField(default=False)

    def get_thumbnail(self):
        if self.image:
            # 生成你需要的缩略图规格,这里用的是fill-50x50
            rendition = self.image.get_rendition('fill-50x50')
            return format_html(
                '<img src="{}" alt="{}的缩略图" style="max-width: 50px; max-height: 50px;">',
                rendition.url, self.title
            )
        return '无图片'
    # 给这个方法指定在列表中显示的列名
    get_thumbnail.short_description = '缩略图'

然后在ViewSet的list_display里直接用这个方法名:

class NewsPostViewSet(ModelViewSet):
    model = NewsPost
    list_display = ["get_thumbnail", "title", "category", "date_start", "date_end", "live"]
    add_to_admin_menu = True
    icon = "calendar-alt"
    menu_label = "News"

这两种方法都是基于Wagtail原生的图片处理功能,不用担心兼容性问题,而且你可以根据自己的需求调整缩略图的尺寸、样式,比如把fill-50x50改成width-100或者其他Wagtail支持的规格。

备注:内容来源于stack exchange,提问作者Fuchsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 13:53:02