web-dev-qa-db-fra.com

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" />
47
Asinox

C’est dans le code source de photologue (voir models.py, légèrement adapté pour supprimer des éléments inutiles):

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 également identique, et je sais que cela fonctionne. La seule chose qui me semble suspecte est votre retrait - les deux lignes commençant par image_img à la fin de votre code models.py devraient être au même niveau que 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
68
Dominic Rodger

Ajoutez 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',)
7
Avinash Garg

Ajoutant à @dominic, je voulais utiliser cela dans plusieurs modèles. J'ai donc créé une fonction que je pouvais appeler dans chaque modèle, en saisissant l'image à afficher.

Par exemple, dans une application, 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 une fonction de Frontpage qui renvoie une image.

Dans une autre application, 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'objet image et le short_description tout en conservant 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
6
saul.shanabrook

Avec Django-imagekit vous pouvez ajouter une image comme celle-ci:

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

Puisque allow_tags est obsolète, vous devez utiliser la fonction format_html. L'exemple de code ressemble à ceci: 

models.py fichier:

class TestAdminModel(models.Model):

    img = models.URLField()

admin.py fichier:

from Django.utils.html import format_html

class TestAdmin(admin.ModelAdmin):
    list_display = ["id", "img", "thumbnail"]

    def thumbnail(self, obj):
        return format_html('<img src="{}" style="width: 130px; \
                           height: 100px"/>'.format(obj.img))

    thumbnail.short_description = 'thumbnail'

admin.site.register(models.TestAdminModel, TestAdmin)

Le résultat ressemble à ceci:  enter image description here

Vous pouvez voir plus de détails dans la documentation Django.

0
ramwin