【发布时间】:2017-10-16 22:33:23
【问题描述】:
【问题讨论】:
-
也许这个解决方案也适用于你的情况:stackoverflow.com/a/38718010/621690
标签: python django django-models
【问题讨论】:
标签: python django django-models
经过大量挖掘,我设法做到了。不幸的是,我找不到我使用的来源(标签太多,太多不起作用..)。所以这个想法是创建一个图像小部件,附加一些 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
您需要在 model.py 中添加一个方法:
def thumbnail(self):
return u'<img src="%s" />' % (self.image.url)
thumbnail.short_description = 'Thumbnail'
然后在 admin.py 中添加:
fields = ( 'thumbnail', )
readonly_fields = ('thumbail',)
这将在那里添加缩略图。
【讨论】:
接着,@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}
}
【讨论】:
在 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',)
【讨论】:
第一个答案的清理版本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'
这是可能的。我不久前做过这样的事情。不幸的是,我再也找不到代码了。要更改 django 管理员中的表示,您必须覆盖您正在使用的默认管理员模板。 docs
【讨论】: