Предотвратить администратору django избежать html - PullRequest
37 голосов
/ 21 июля 2010

Я пытаюсь отобразить миниатюры изображений в list_display администратора django, и я делаю это так:

from django.utils.safestring import mark_safe

class PhotoAdmin(admin.ModelAdmin):
    fields = ('title', 'image',)
    list_display = ('title', '_get_thumbnail',)

    def _get_thumbnail(self, obj):
        return mark_safe(u'<img src="%s" />' % obj.admin_thumbnail.url)

Администратор продолжает отображать миниатюру как экранированный html, хотя я пометил строку как безопасную. Что я делаю не так?

Ответы [ 2 ]

81 голосов
/ 21 июля 2010

Начиная с Django 1.9, вы можете использовать format_html(), format_html_join() или allow_tags в вашем методе.Для получения дополнительной информации см. Документы list_display.

Код в вопросе, использующий mark_safe, будет работать.Однако лучшим вариантом для таких методов может быть format_html, который будет экранировать аргументы.

def _get_thumbnail(self, obj):
    return format_html(u'<img src="{}" />', obj.admin_thumbnail.url)

В более ранних версиях Django использование mark_safe() не сработало бы, и Django избежал вывода.Решением было присвоить методу атрибут allow_tags со значением, установленным в True.

class PhotoAdmin(admin.ModelAdmin):
    fields = ('title', 'image',)
    list_display = ('title', '_get_thumbnail',)

    def _get_thumbnail(self, obj):
         return u'<img src="%s" />' % obj.admin_thumbnail.url
    _get_thumbnail.allow_tags = True
5 голосов
/ 22 января 2014

Я знаю, что это довольно поздний ответ, но я думал, что более полная реализация будет полезна для других ...

Если у вас его еще нет с django-filer, получите easy_thumbnails pip install easy-thumbnails.

# -*- coding: utf-8 -*-

from django.contrib import admin

from easy_thumbnails.files import get_thumbnailer

from models import Photo


class PhotoAdmin(admin.ModelAdmin):
    list_display = ('_thumbnail', 'title', )
    list_display_links = ('_thumbnail', 'title', )  # This makes the icon clickable too
    readonly_fields = ('_thumbnail', )
    fields = ('title', 'photo', )

    def _thumbnail(self, obj):
        if obj.photo:
            thumbnailer = get_thumbnailer(obj.photo)
            thumb = thumbnailer.get_thumbnail({
                'crop': True,
                'size': (50, 50),
                # Sharpen it up a little, since its so small...
                'detail': True,
                # Put other options here...
            })
            # Note: we get the actual width/height rather than
            # hard-coding 50, 50, just to be DRYer
            return u'<img src="%s" alt="thumbnail: %s" width="%d" height="%d"/>' % (thumb.url, obj.photo.name, thumb.width, thumb.height)
        else:
            return "[No Image]"

    # Optional, Provide a nicer label in the display
    _thumbnail.short_description = 'Thumbnail'

    # Required, leaves the markup un-escaped
    _thumbnail.allow_tags = True

admin.site.register(Photo, PhotoAdmin)
...