【问题标题】:Django admin and showing thumbnail imagesDjango 管理员并显示缩略图
【发布时间】: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" />

【问题讨论】:

    标签: python django django-admin


    【解决方案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/…
    • 如果我还想在模型的编辑页面上显示缩略图怎么办?仅供参考,大家知道当前上传的是什么图片吗?
    • 知道了stackoverflow.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 width="{}" 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']
        

        【讨论】:

          猜你喜欢
          • 2017-10-16
          • 2012-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-28
          • 2014-09-08
          • 1970-01-01
          • 2017-10-09
          相关资源
          最近更新 更多