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" />
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
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',)
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
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']
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)
Vous pouvez voir plus de détails dans la documentation Django.