Миниатюры в админ панели django с помощью sorl - PullRequest
3 голосов
/ 01 февраля 2010

Я пытаюсь, чтобы картинки, которые я загружаю в админ-панели Django, отображались в виде миниатюр вместо пути. Я установил sorl и могу создавать миниатюры, которые отображаются в моих представлениях.

Я нашел 2 фрагмента (http://www.djangosnippets.org/snippets/579/ и http://www.djangosnippets.org/snippets/934/), которые я пытался реализовать, но обе попытки потерпели неудачу из-за скудной документации и моего пока еще поверхностного понимания инфраструктуры Django.

Может ли кто-нибудь предоставить пошаговое пошаговое руководство о том, как заставить это работать?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 30 ноября 2010

Я знаю, что это старый пост, но я думаю, что, возможно, я нашел более короткий путь, чем метод переопределения шаблона администратора выше (хотя это довольно крутое решение - мне придется использовать его в других обстоятельствах)Это просто вызывает напрямую функцию 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 и показ уменьшенных изображений

4 голосов
/ 01 февраля 2010

Да :) Я могу;)

Сначала вам нужно создать пользовательский тег шаблона, который обрабатывает миниатюру:

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

и, конечно же, шаблоны тегов необходимо добавить в INSTALLED_APPв комплектеtings;)

это все;) Надеюсь, это поможет.

...