【问题标题】:Display thumbnail in Django admin inline在 Django 管理内联中显示缩略图
【发布时间】:2017-10-16 22:33:23
【问题描述】:

我是 Django 新手,正在尝试更改内联图像在管理面板中的显示方式。我可以在每个“当前”上方添加一个预览标签并显示缩略图吗?

【问题讨论】:

标签: python django django-models


【解决方案1】:

经过大量挖掘,我设法做到了。不幸的是,我找不到我使用的来源(标签太多,太多不起作用..)。所以这个想法是创建一个图像小部件,附加一些 html 脚本。

from django.contrib.admin.widgets import AdminFileWidget

class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            image_url = value.url
            file_name = str(value)
            output.append(u' <a href="%s" target="_blank"><img src="%s" alt="%s" width="150" height="150"  style="object-fit: cover;"/></a> %s ' % \
                (image_url, image_url, file_name, _('')))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))


class CollectionImageInline(admin.TabularInline):
    formfield_overrides = {models.ImageField: {'widget': AdminImageWidget}}

结果:(无论这个问题如何,我都将管理主题更改为默认主题)

【讨论】:

  • 这行得通,谢谢。我会在顶部添加导入:from django.utils.safestring import marksafe from django.db import models
【解决方案2】:

您需要在 model.py 中添加一个方法:

def thumbnail(self):
  return u'<img src="%s" />' % (self.image.url)

thumbnail.short_description = 'Thumbnail'

然后在 admin.py 中添加:

fields = ( 'thumbnail', )
readonly_fields = ('thumbail',)

这将在那里添加缩略图。

【讨论】:

  • 我这样做了,但我希望内嵌图像具有相同的功能。
【解决方案3】:

接着,@shaniqwa 回答,django(2.2.7) 现在需要 render() 中的渲染器,

class AdminImageWidget(AdminFileWidget):

    def render(self, name, value, attrs=None, renderer=None):
        output = []

        if value and getattr(value, "url", None):
            image_url = value.url
            file_name = str(value)

            output.append(
                f' <a href="{image_url}" target="_blank">'
                f'  <img src="{image_url}" alt="{file_name}" width="150" height="150" '
                f'style="object-fit: cover;"/> </a>')

        output.append(super(AdminFileWidget, self).render(name, value, attrs, renderer))
        return mark_safe(u''.join(output))


class ProductImagesAdmin(admin.TabularInline):
    model = ProductImages
    extra = 1
    formfield_overrides = {
        models.ImageField: {'widget': AdminImageWidget}
    }

【讨论】:

    【解决方案4】:

    在 Django 3.0 中适用于我的简单解决方案:

    在models.py中添加:

    from django.utils.safestring import mark_safe
    
    def image_preview(self):
        if self.image:
            return mark_safe('<img src="{0}" width="150" height="150" />'.format(self.image.url))
        else:
            return '(No image)'
    

    在 admin.py 中:

    class ProductImagesAdmin(admin.TabularInline):
        model = ProductImages
        readonly_fields = ('image_preview',)
    

    【讨论】:

      【解决方案5】:

      第一个答案的清理版本https://stackoverflow.com/a/44051507/2020723 - 准备好Django >3,python 3.x:

      class AdminImageWidget(AdminFileWidget):
          """Admin widget for showing clickable thumbnail of Image file fields"""
      
          def render(self, name, value, attrs=None, renderer=None):
              html = super().render(name, value, attrs, renderer)
              if value and getattr(value, 'url', None):
                  html = format_html('<a href="{0}" target="_blank"><img src="{0}" alt="{1}" width="150" height="150" style="object-fit: contain;"/></a>', value.url, str(value)) + html
              return html
      

      【讨论】:

      • 感谢您的回答。但是当我点击“提交”或“删除”时出现以下错误'AdminImageWidget' object has no attribute 'decompress'
      【解决方案6】:

      这是可能的。我不久前做过这样的事情。不幸的是,我再也找不到代码了。要更改 django 管理员中的表示,您必须覆盖您正在使用的默认管理员模板。 docs

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 2012-12-13
        • 2012-04-20
        • 2014-08-05
        • 2014-07-17
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多