Thumbnails في لوحة مسؤول Django باستخدام Sorl
-
24-09-2019 - |
سؤال
أحاول أن أحصل على الصور التي أقوم بتحميلها في لوحة Django Admin لتظهر كصورة مصغرة بدلاً من المسار. لقد قمت بتثبيت Sorl ويمكنني صنع الصور المصغرة التي تظهر في وجهات نظري.
لقد وجدت 2 مقتطفات (http://www.djangosnippets.org/snippets/579/ و http://www.djangosnippets.org/snippets/934/) لقد حاولت تنفيذها ، لكن كلتا المحاولتين قد فشلت بسبب الوثائق الضئيلة وفهمي الضحل حتى الآن لإطار Django.
هل يمكن لشخص ما تقديم دليل مغلق خطوة بخطوة لكيفية جعل هذا العمل؟
شكرًا!
المحلول
نعم استطيع ؛)
تحتاج أولاً إلى إنشاء علامة قالب مخصص تعالج الصورة المصغرة:
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 هو thumnail الذي تم إنشاؤه بواسطة 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 ملفات:
- templates_dir/admin/app_name/model_name/change_list.html
- templates_dir/admin/app_name/model_name/change_list_result.html
- Your_Project/App_name/TemplateTags/my_admin_tags.py
وبالطبع ، يجب إضافة TemplateTags إلى تثبيت install_app في الإعدادات ؛)
هذا كل شيء ؛) آمل أن يكون هذا مفيدًا.
نصائح أخرى
أعلم أن هذا منشور قديم ، لكنني أعتقد أنني ربما وجدت طريقة أقصر من طريقة تجاوز قالب المشرف أعلاه (على الرغم من أن هذا حل رائع - سأضطر إلى استخدامه في ظرف آخر). هذا ببساطة يقوم بدعوة مباشرة إلى وظيفة 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.