【问题标题】:Thumbnails in the django admin panel using sorl使用 sorl 的 django 管理面板中的缩略图
【发布时间】:2011-01-11 20:11:46
【问题描述】:

我正在尝试让我在 Django 管理面板中上传的图片显示为缩略图而不是路径。我已经安装了 sorl,并且可以制作显示在我的视图中的缩略图。

我找到了 2 个我尝试实现的 sn-ps(http://www.djangosnippets.org/snippets/579/http://www.djangosnippets.org/snippets/934/),但由于文档很少,而且我对 Django 框架的理解还很浅,这两次尝试都失败了。

有人可以提供一个简单的分步指南,告诉我如何让它工作吗?

谢谢!

【问题讨论】:

    标签: django django-admin thumbnails sorl-thumbnail


    【解决方案1】:

    我知道这是一篇旧帖子,但我想我可能找到了比上面的管理模板覆盖方法更短的方法(尽管这是一个非常棒的解决方案 - 我将不得不在另一种情况下使用它)。这只是直接调用 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

    【讨论】:

      【解决方案2】:

      是的 :) 我可以 ;)

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

      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_tag 是 sorl 创建的缩略图 :) [我从默认模板标签中得到了原始代码]

      其次,您需要为您的模型创建一个模板(使用新的自定义模板标签),它必须位于此目录架构中: templates_dir/admin/app_name/model/change_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 %}
      

      正如您在标记函数中看到的,您需要再创建一个模板(称为 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. templates_dir/admin/app_name/model_name/change_list.html
      2. templates_dir/admin/app_name/model_name/change_list_result.html
      3. your_project/app_name/templatetags/my_admin_tags.py

      当然,必须在设置中将模板标签添加到 INSTALLED_APP ;)

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

      【讨论】:

        猜你喜欢
        • 2015-06-10
        • 2011-08-10
        • 2013-11-17
        • 2018-09-16
        • 2014-08-21
        • 2015-07-13
        • 2016-05-10
        • 2012-11-29
        • 2012-12-13
        相关资源
        最近更新 更多