2010-07-21 37 views
28

Tôi đang cố gắng để hiển thị hình thu nhỏ hình ảnh trong list_display django của admin và tôi đang làm nó như thế này:Ngăn chặn django quản trị thoát 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) 

Quản trị giữ hiển thị hình thu nhỏ như html loại trừ, mặc dù tôi đánh dấu chuỗi an toàn. Tôi đang làm gì sai?

Trả lời

67

Kể từ Django 1.9, bạn có thể sử dụng format_html(), format_html_join() hoặc allow_tags trong phương pháp của mình. Xem tài liệu list_display để biết thêm thông tin.

Mã trong câu hỏi sử dụng mark_safe sẽ hoạt động. Tuy nhiên một lựa chọn tốt hơn cho các phương pháp như thế này có thể là format_html, sẽ thoát khỏi các đối số.

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

Trong các phiên bản trước của Django, sử dụng mark_safe() sẽ không hoạt động và Django sẽ thoát khỏi đầu ra. Giải pháp là cung cấp cho phương thức thuộc tính allow_tags với giá trị được đặt thành 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

Cảm ơn bạn đã làm rõ, tôi không thể tìm thấy trong tài liệu. – Andy

+0

@Andy, nếu điều đó phù hợp với bạn, hãy nhấp vào dấu kiểm theo điểm số câu trả lời này phải chấp nhận nó. –

+1

Không chắc chắn nhưng tôi nghĩ rằng cú pháp đúng là với '{}', không phải '% s'. Vì vậy, nó sẽ là: 'format_html (u '', obj.admin_thumbnail.url)'. – Paolo

5

Tôi biết đây là một câu trả lời khá muộn, nhưng tôi nghĩ một việc thực hiện đầy đủ hơn sẽ giúp ích cho người khác ...

Nếu bạn không có nó đã có django-filer, có 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) 
Các vấn đề liên quan