2010-07-21 15 views
28

Estoy tratando de mostrar las imágenes en miniatura en list_display Django admin y lo estoy haciendo de esta manera:Prevenir Django administrador escape html

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) 

de administración permite seguir mostrando la miniatura como html escapado, aunque he marcado la cadena como seguro. ¿Qué estoy haciendo mal?

Respuesta

67

A partir de Django 1.9, puede usar format_html(), format_html_join() o allow_tags en su método. Consulte los documentos list_display para obtener más información.

El código en la pregunta usando mark_safe funcionará. Sin embargo, una mejor opción para métodos como estos podría ser format_html, que escapará a los argumentos.

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

En versiones anteriores de Django, utilizando mark_safe() no funcionaría, y Django escaparía la salida. La solución fue dar al método un atributo allow_tags con el valor establecido en 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 
+0

Gracias por aclararme, no pude encontrarlo en los documentos. – Andy

+0

@Andy, si eso funciona para usted, haga clic en la marca de verificación debajo del puntaje que esta respuesta debe aceptar. –

+1

No estoy seguro pero creo que la sintaxis correcta es con '{}', no '% s'. Entonces sería: 'format_html (u '', obj.admin_thumbnail.url)'. – Paolo

5

Sé que esto es una respuesta bastante tarde, pero pensé que una aplicación más completa sería de utilidad para otros ...

Si no lo tiene ya con django-Filer, obtener 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) 
Cuestiones relacionadas