54 votes

Django admin et affichage des images miniatures

J'essaie d'afficher des images miniatures dans Django, mais je ne peux voir que le chemin d'accès aux images, mais pas les images rendues. Je ne sais pas ce que je fais mal.

URL du média serveur:

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

Modèle de 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" />
 

76voto

Dominic Rodger Points 44489

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

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

L' list_display bits ressemble trop, et je sais que cela fonctionne. La seule chose qui semble suspect pour moi, c'est votre indentation - les deux lignes commençant image_img à la fin de votre models.py code 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

7voto

Avinash Garg Points 266

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 ), ajoutez:

 readonly_fields = ('image_tag',)
 

6voto

saul.shanabrook Points 625

Ajoutant à @dominique, je voulais l'utiliser dans de multiples modèles, j'ai donc créé une fonction que je pouvais l'appeler, dans chaque modèle, de l'entrée de 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 spécifier l'image de l'objet et de l' short_description tout en gardant le code 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X