2009-09-06 5 views
46

J'essaie d'afficher des images miniatures dans l'admin Django, mais je ne peux voir que le chemin vers les images, mais pas les images rendues. Je ne sais pas ce que je fais mal.Administrateur Django et affichage d'images miniatures

URL du serveur média:

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

modèle Fonction:

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',) 

Et le résultat:

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

Répondre

67

C'est dans la source pour photologue (voir models.py, légèrement adapté pour enlever des choses non pertinentes):

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

Le bit list_display semble trop identique, et je sais que cela fonctionne. La seule chose qui semble suspect pour moi est votre empreinte - les deux lignes commençant image_img à la fin de votre code models.py doit être de niveau avec def image_img(self):, comme ceci:

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 pour l'indentation étant le problème. –

+0

Oui, était l'indentation, merci – Asinox

+1

Où vous mettez cette fonction image_img? Je l'ai écrit sous la classe ImagesAdmin (admin.ModelAdmin): 'mais il me donne l'erreur comme' Caught TypeError lors du rendu: image_img() prend exactement 1 argument (2 donné) ' – brsbilgic

6

Ajouter à @dominic, je voulais utiliser ceci dans plusieurs modèles, j'ai donc créé une fonction que je pourrais appeler dans chaque modèle, en entrant l'image à afficher.

Par exemple, dans une application que j'ai:

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) 

avec image fonction de Frontpage qui renvoie une image.

Dans une autre application que j'ai:

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) 

Cela me permet de préciser l'objet de l'image et la short_description tout en gardant le passe-partout dans un autre fichier. La fonction est:

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

Ajouter une méthode dans votre modèle (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 

et dans votre ModelAdmin (admin.py) ajouter:.

readonly_fields = ('image_tag',) 
+0

format à python standard plz ... –

+1

N'oubliez pas de ajouter image_tag aux champs aussi: 'fields = ['image_tag', ...]' –

9

Mise à jour v 1.9

Notez que dans Django v.1.9

image_tag.allow_tags = True 

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

donc votre modèle.py devrait ressembler à ceci:

... 
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' 

et dans votre admin.py ajouter:

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

et pour l'ajouter dans le 'mode Edition' de votre panneau d'administration dans votre admin.py ajouter:

fields = ('image_img',) 
+0

Notes: La méthode 'image_img()' devrait accepter une 'instance':' def image_img (self, instance): 'et use' instance' au lieu de 'self' pour obtenir l'URL. –

+0

'def image_img (self):', alors vous pouvez utiliser 'self.field_name' pour obtenir le champ, vous n'avez pas besoin d'instance param (ma version de Django v1.9) @ Phil Gyford –

1

Avec django-imagekit vous pouvez ajouter une image comme ceci:

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']