2009-09-06 17 views
46

Próbuję wyświetlić miniatury w administratorze Django, ale widzę tylko ścieżkę do obrazów, ale nie obrazy renderowane. Nie wiem, co robię źle.Administrator Django i wyświetlanie miniatur obrazów

Media Server URL:

from django.conf import settings 
(r'^public/(?P<path>.*)$', 'django.views.static.serve',{'document_root': settings.MEDIA_ROOT}), 

modelu Funkcja:

def image_img(self): 
     if self.image: 
      return u'<img src="%s" />' % self.image.url_125x125 
     else: 
      return '(Sin imagen)' 
     image_img.short_description = 'Thumb' 
     image_img.allow_tags = True 

admin.py:

class ImagesAdmin(admin.ModelAdmin): 

    list_display= ('image_img','product',) 

A wynik:

<img src="http://127.0.0.1:8000/public/product_images/6a00d8341c630a53ef0120a556b3b4970c.125x125.jpg" /> 

Odpowiedz

67

Jest to źródło dla photologue (patrz models.py, nieznacznie przystosowana do usuwania nieistotnych rzeczy):

def admin_thumbnail(self): 
    return u'<img src="%s" />' % (self.image.url) 
admin_thumbnail.short_description = 'Thumbnail' 
admin_thumbnail.allow_tags = True 

list_display nieco zbyt wygląda identycznie, i wiem, że działa. Jedyną rzeczą, która wygląda podejrzanego mi to wcięcie - dwie linie zaczynające image_img na końcu kodu models.py powinna znajdować się na wysokości def image_img(self):, tak:

def image_img(self): 
    if self.image: 
     return u'<img src="%s" />' % self.image.url_125x125 
    else: 
     return '(Sin imagen)' 
image_img.short_description = 'Thumb' 
image_img.allow_tags = True 
+0

+1 za problem z wcięciem. –

+0

Tak, było wcięcie, dzięki – Asinox

+1

Gdzie umieścić tę funkcję image_img? Napisałem go pod 'class ImagesAdmin (admin.ModelAdmin):' ale daje mi błąd jako 'Caught TypeError podczas renderowania: image_img() bierze dokładnie 1 argument (2 dane)' – brsbilgic

6

Dodawanie do @dominic, chciałem użyć to w wielu modelach, więc stworzyłem funkcję, którą mogłem wywołać w każdym modelu, wprowadzając obraz, który ma być wyświetlany.

Na przykład w jednej aplikacji mam:

from django.contrib import admin 

from .models import Frontpage 
from ..admin import image_file 


class FrontpageAdmin(admin.ModelAdmin): 
    list_display = ('image_thumb', ...) 

    image_thumb = image_file('obj.image()') 

admin.site.register(Frontpage, FrontpageAdmin) 

z image funkcją Pierwsza, która zwraca obraz.

W innej aplikacji mam:

from django.contrib import admin 

from .models import Exhibition 
from ..admin import image_file 


class ExhibitionAdmin(admin.ModelAdmin): 
    list_display = ('first_image_thumb', ...) 

    first_image_thumb = image_file('obj.related_object.image', 
            short_description='First Image') 

admin.site.register(Exhibition, ExhibitionAdmin) 

To pozwala mi określić przedmiot obrazu i short_description utrzymując boilerplate w innym pliku. Funkcja:

from sorl.thumbnail import get_thumbnail 
from django.conf import settings 


def image_file(image, short_description='Image'): 
    def image_thumb(self, obj): 
     image = eval(image_thumb.image) 
     if image: 
      thumb = get_thumbnail(image.file, settings.ADMIN_THUMBS_SIZE) 
      return u'<img width="{}" height={} src="{}" />'.format(thumb.width, thumb.height, thumb.url) 
     else: 
      return "No Image" 

    image_thumb.__dict__.update({'short_description': short_description, 
           'allow_tags': True, 
           'image': image}) 
    return image_thumb 
7

Dodaj metodę w modelu (models.py):

def image_tag(self): 
    return u'<img src="%s" />' % <URL to the image> 
image_tag.short_description = 'Image' 
image_tag.allow_tags = True 

iw swoim ModelAdmin (admin.py) dodać:.

readonly_fields = ('image_tag',) 
+0

format do python standard plz ... –

+1

Nie zapomnij dodaj image_tag do pól również: 'fields = ['image_tag', ...]' –

9

Aktualizacja v 1.9

Należy zauważyć, że w Django v. 19

image_tag.allow_tags = True 

is depricated and you should use format_html(), format_html_join(), or mark_safe() instead

Więc modelu.py powinna wyglądać następująco:

... 
def image_img(self): 
    if self.image: 
     return marksafe('<img src="%s" />' % self.image.url_125x125) 
    else: 
     return '(Sin imagen)' 
    image_img.short_description = 'Thumb' 

oraz w admin.py dodają:

list_display= ('image_img','product',) 
readonly_fields = ('image_img',) 

i dodanie go w trybie edycji z panelu administratora w admin.py add:

fields = ('image_img',) 
+0

Uwagi: Metoda 'image_img()' powinna akceptować 'instancję':' def image_img (self, instance): 'and use' instancja 'zamiast' self' dla uzyskania adresu URL. –

+0

'def image_img (self):', następnie możesz użyć 'self.field_name' do pobrania pola, nie potrzebujesz instancji (moja wersja Django v1.9) @ Phil Gyford –

1

Z django-imagekit można dodać dowolny obraz tak:

from imagekit.admin import AdminThumbnail 

@register(Fancy) 
class FancyAdmin(ModelAdmin): 
    list_display = ['name', 'image_display'] 
    image_display = AdminThumbnail(image_field='image') 
    image_display.short_description = 'Image' 

    # set this to also show the image in the change view 
    readonly_fields = ['image_display'] 
Powiązane problemy