Django 管理员并显示缩略图
Posted
技术标签:
【中文标题】Django 管理员并显示缩略图【英文标题】:Django admin and showing thumbnail images 【发布时间】:2010-11-25 23:39:47 【问题描述】:我正在尝试在 Django 管理中显示缩略图,但我只能看到图像的路径,而不是渲染的图像。我不知道我做错了什么。
服务器媒体网址:
from django.conf import settings
(r'^public/(?P<path>.*)$', 'django.views.static.serve','document_root': settings.MEDIA_ROOT),
功能模型:
def image_img(self):
if self.image:
return u'<img src="%s" />' % self.image.url_125x125
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
image_img.allow_tags = True
admin.py:
class ImagesAdmin(admin.ModelAdmin):
list_display= ('image_img','product',)
结果:
<img src="http://127.0.0.1:8000/public/product_images/6a00d8341c630a53ef0120a556b3b4970c.125x125.jpg" />
【问题讨论】:
【参考方案1】:这是photologue 的源代码(参见models.py
,稍作修改以删除不相关的内容):
def admin_thumbnail(self):
return u'<img src="%s" />' % (self.image.url)
admin_thumbnail.short_description = 'Thumbnail'
admin_thumbnail.allow_tags = True
list_display
位看起来也一样,我知道这很有效。唯一让我觉得可疑的是您的缩进 - 在您的 models.py
代码末尾以 image_img
开头的两行应该与 def image_img(self):
保持一致,如下所示:
def image_img(self):
if self.image:
return u'<img src="%s" />' % self.image.url_125x125
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
image_img.allow_tags = True
【讨论】:
你把 image_img 函数放在哪里了?我已经在class ImagesAdmin(admin.ModelAdmin):
下写了它,但它给了我错误Caught TypeError while rendering: image_img() takes exactly 1 argument (2 given)
@brsbilgic - 它需要在您的模型下,除非您在self
之后添加第二个参数,称为obj
,它代表您正在使用的模型。见docs.djangoproject.com/en/dev/ref/contrib/admin/…。
如果我还想在模型的编辑页面上显示缩略图怎么办?仅供参考,大家知道当前上传的是什么图片吗?
知道了***.com/questions/16307307/…(以防其他人也想知道)【参考方案2】:
1.9 版更新
请注意,在 Django v.1.9
image_tag.allow_tags = True
is depricated and you should use format_html(), format_html_join(), or mark_safe() instead
所以你的 model.py 应该是这样的:
...
from django.utils.html import mark_safe
def image_img(self):
if self.image:
return mark_safe('<img src="%s" />' % self.image.url_125x125)
else:
return '(Sin imagen)'
image_img.short_description = 'Thumb'
并在您的 admin.py 中添加:
list_display= ('image_img','product',)
readonly_fields = ('image_img',)
并在 admin.py 的管理面板的“编辑模式”中添加它:
fields = ( 'image_img', )
【讨论】:
注意:image_img()
方法应该接受instance
: def image_img(self, instance):
并使用instance
而不是self
来获取URL。
def image_img(self):
,那么你可以使用self.field_name
来获取字段,不需要实例参数(我的Django版本v1.9)@Phil Gyford【参考方案3】:
在您的模型中添加一个方法 (models.py
):
def image_tag(self):
return u'<img src="%s" />' % <URL to the image>
image_tag.short_description = 'Image'
image_tag.allow_tags = True
并在您的 ModelAdmin (admin.py
) 中添加:
readonly_fields = ('image_tag',)
【讨论】:
别忘了在字段中添加 image_tag:fields = ['image_tag', ...]
【参考方案4】:
添加到@dominic,我想在多个模型中使用它,所以我创建了一个可以在每个模型中调用的函数,输入要显示的图像。
例如,在我拥有的一个应用中:
from django.contrib import admin
from .models import Frontpage
from ..admin import image_file
class FrontpageAdmin(admin.ModelAdmin):
list_display = ('image_thumb', ...)
image_thumb = image_file('obj.image()')
admin.site.register(Frontpage, FrontpageAdmin)
使用 image
的 Frontpage 函数返回图像。
在我的另一个应用中:
from django.contrib import admin
from .models import Exhibition
from ..admin import image_file
class ExhibitionAdmin(admin.ModelAdmin):
list_display = ('first_image_thumb', ...)
first_image_thumb = image_file('obj.related_object.image',
short_description='First Image')
admin.site.register(Exhibition, ExhibitionAdmin)
这允许我指定图像对象和short_description
,同时将样板保存在另一个文件中。功能是:
from sorl.thumbnail import get_thumbnail
from django.conf import settings
def image_file(image, short_description='Image'):
def image_thumb(self, obj):
image = eval(image_thumb.image)
if image:
thumb = get_thumbnail(image.file, settings.ADMIN_THUMBS_SIZE)
return u'<img height= src="" />'.format(thumb.width, thumb.height, thumb.url)
else:
return "No Image"
image_thumb.__dict__.update('short_description': short_description,
'allow_tags': True,
'image': image)
return image_thumb
【讨论】:
【参考方案5】:由于allow_tags has been deprecated,你应该使用format_html
函数。示例代码如下所示:
models.py
文件:
class TestAdminModel(models.Model):
img = models.URLField()
admin.py
文件:
from django.utils.html import format_html
class TestAdmin(admin.ModelAdmin):
list_display = ["id", "img", "thumbnail"]
def thumbnail(self, obj):
return format_html('<img src="" style="width: 130px; \
height: 100px"/>'.format(obj.img))
thumbnail.short_description = 'thumbnail'
admin.site.register(models.TestAdminModel, TestAdmin)
结果如下所示:
您可以在django documentation.查看更多详情
【讨论】:
【参考方案6】:使用django-imagekit,您可以像这样添加任何图像:
from imagekit.admin import AdminThumbnail
@register(Fancy)
class FancyAdmin(ModelAdmin):
list_display = ['name', 'image_display']
image_display = AdminThumbnail(image_field='image')
image_display.short_description = 'Image'
# set this to also show the image in the change view
readonly_fields = ['image_display']
【讨论】:
以上是关于Django 管理员并显示缩略图的主要内容,如果未能解决你的问题,请参考以下文章