2010-07-21 12 views
28

Sto cercando di visualizzare le miniature delle immagini in list_display Django di admin e lo sto facendo in questo modo:Impedire django amministratore di fuggire 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) 

Admin continua a visualizzare la miniatura come html sfuggito, anche se ho segnato la stringa come al sicuro. Che cosa sto facendo di sbagliato?

risposta

67

A partire da Django 1.9, è possibile utilizzare format_html(), format_html_join() o allow_tags nel metodo. Vedi i documenti list_display per maggiori informazioni.

Il codice nella domanda utilizzando mark_safe funzionerà. Tuttavia un'opzione migliore per metodi come questi potrebbe essere format_html, che sfuggirà agli argomenti.

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

Nelle versioni precedenti di Django, utilizzando mark_safe() non avrebbe funzionato, e Django sarebbe sfuggire l'uscita. La soluzione era di dare al metodo un attributo allow_tags con il valore impostato su 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

Grazie per i chiarimenti, non sono riuscito a trovarlo nei documenti. – Andy

+0

@Andy, se questo funziona per te, fai clic sul segno di spunta sotto il punteggio questa risposta deve accettarlo. –

+1

Non sono sicuro, ma penso che la sintassi corretta sia con '{}', non '% s'. Quindi sarebbe: 'format_html (u '', obj.admin_thumbnail.url)'. – Paolo

5

So che questa è una risposta piuttosto tardi, ma ho pensato che un'implementazione più completa sarebbe utile per gli altri ...

Se non lo avete già con django-Filer, ottenere 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) 
Problemi correlati