我试图让我在 Django 管理面板中上传的图片显示为缩略图而不是路径。我已经安装了 sorl,并且可以制作显示在我的视图中的缩略图。
我找到了我尝试实现的2 个片段( http://www.djangosnippets.org/snippets/579/和http://www.djangosnippets.org/snippets/934/ ),但两次尝试都失败了,因为微薄的文档和我对 Django 框架的浅薄理解。
有人可以提供一个简单的分步指南,告诉我如何让它工作吗?
谢谢!
我试图让我在 Django 管理面板中上传的图片显示为缩略图而不是路径。我已经安装了 sorl,并且可以制作显示在我的视图中的缩略图。
我找到了我尝试实现的2 个片段( http://www.djangosnippets.org/snippets/579/和http://www.djangosnippets.org/snippets/934/ ),但两次尝试都失败了,因为微薄的文档和我对 Django 框架的浅薄理解。
有人可以提供一个简单的分步指南,告诉我如何让它工作吗?
谢谢!
我知道这是一篇旧帖子,但我想我可能找到了比上面的管理模板覆盖方法更短的方法(尽管这是一个非常棒的解决方案 - 我将不得不在另一种情况下使用它)。这只是直接调用 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 功能。
是的:)我可以;)
首先,您需要创建一个处理缩略图的自定义模板标签:
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个文件:
当然,必须在设置中将模板标签添加到 INSTALLED_APP ;)
这就是全部;)希望这会有所帮助。