سؤال

أحاول أن أحصل على الصور التي أقوم بتحميلها في لوحة 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 ملفات:

  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

وبالطبع ، يجب إضافة 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.

مسؤول Django ويظهر صور Thumbnail

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top