代码之家  ›  专栏  ›  技术社区  ›  BioGeek

使用SORL在Django管理面板中显示缩略图

  •  3
  • BioGeek  · 技术社区  · 16 年前

    我试图让我上传到django管理面板的图片显示为缩略图而不是路径。我已经安装了SORL,可以在我的视图中显示缩略图。

    我发现了两个片段( http://www.djangosnippets.org/snippets/579/ 和 http://www.djangosnippets.org/snippets/934/ )我已经尝试过实现,但是两次尝试都失败了,因为文档很少,而且我对Django框架的理解还很浅。

    有人能给我一个详细的指导,告诉我怎样才能让它工作吗?

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  4
  •   patrick genkilabs    16 年前

    是的:)我可以;)

    首先,您需要创建一个处理缩略图的自定义模板标记:

    from django.template import Library
    from django.utils.safestring import mark_safe
    from django.contrib.admin.templatetags.admin_list import result_headers
    
    register = Library()
    
    def results(cl):
        out = []
        for item in cl.result_list:
            url = cl.url_for_result(item)
            code = '<a href="%(url)s">%(img)s</a> <div><a href="%(url)s">%(title)s</a></div>' % {
                'url': url,
                'img': item.preview.thumbnail_tag,
                'title': item.title,
            }
            out.append(mark_safe(code))
    
        return out
    
    def gallery_result_list(cl):    
        return {'cl': cl,
                'result_headers': list(result_headers(cl)),
                'results': results(cl)}
    result_list = register.inclusion_tag("admin/app_name/model/change_list_results.html")(gallery_result_list)
    

    其中item.preview.thumbnail标记是sorl创建的thumnail:) [我从默认模板标记中获取了原始代码]

    其次,您需要为您的模型创建一个模板(使用新的自定义模板标记),它必须位于此目录架构中: 模板\u dir/admin/app \u name/model/change \u list.html

    并具有以下代码:

    {% extends "admin/change_list.html" %}
    {% load adminmedia admin_list my_admin_tags i18n %}
    
    {% block result_list %}
        {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
        {% gallery_result_list cl %}
        {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
    {% endblock %}
    

    正如您在tag函数中看到的,您需要再创建一个模板(称为change_list_result.html)来正确显示图像:

    <style>
    td.page { text-align: center; }
    td.page a { font-weight: bold; }
    </style>
    {% if results %}
    <table cellspacing="0">
    <tbody>
    <tr>
    {% for result in results %}
        <td class="page">
            {{ result }}
        </td>
        {% if forloop.counter|divisibleby:3 %}
    </tr><tr>
        {% endif %}
    {% endfor %}
    </tr>
    </tbody>
    </table>
    {% endif %}
    

    所以最后你会有3个文件:

    1. 模板\u dir/admin/app \u name/model \u name/change \u list.html
    2. 模板\目录/管理/应用程序\名称/型号\名称/更改\列表\结果.html
    3. 您的项目/应用程序名称/模板标签/我的管理员标签.py

    当然,必须将templateTags添加到已安装的“设置”中的“应用程序”;)

    这就是全部;)希望这能有所帮助。

        2
  •  13
  •   Community Mohan Dere    9 年前

    我知道这是一篇老文章,但我想我可能找到了一个比上面的管理模板覆盖方法更短的方法(尽管这是一个非常棒的解决方案-我必须在另一种情况下使用它)。这只是直接调用sorl函数来生成缩略图。

    在myapp/admin.py中

    from myapp import models
    from sorl.thumbnail import default
    ADMIN_THUMBS_SIZE = '60x60'
    
    class MyModelAdmin(admin.ModelAdmin):
        model = models.MyModel
        list_display = ['my_image_thumb', 'my_other_field1', 'my_other_field2', ]
    
        def my_image_thumb(self, obj):
            if obj.image:
                thumb = default.backend.get_thumbnail(obj.image.file, ADMIN_THUMBS_SIZE)
                return u'<img width="%s" src="%s" />' % (thumb.width, thumb.url)
            else:
                return "No Image" 
        my_image_thumb.short_description = 'My Thumbnail'
        my_image_thumb.allow_tags = True
    

    我基于以下问题,但添加了SORL功能。

    Django admin and showing thumbnail images