在Django admin inline

时间:2017-05-17 12:44:21

标签: python django django-models

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

enter image description here

6 个答案:

答案 0 :(得分:6)

经过大量的挖掘,我成功完成了这项工作。不幸的是,我无法找到我使用的来源(太多标签,太多没有工作......)。所以我的想法是创建一个Image Widget,它附加一些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}}

结果:(无论此问题如何,我都将管理主题更改为默认值) enter image description here

答案 1 :(得分:1)

接着,对@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}
    }

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要向model.py添加方法:

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

thumbnail.short_description = 'Thumbnail'

然后在admin.py中你要添加:

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

那将在那里添加缩略图。

答案 4 :(得分:0)

在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 :(得分:0)

第一个答案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