Ich versuche, Miniaturbilder in Django Admin anzuzeigen, aber ich kann nur den Pfad zu den Bildern sehen, aber nicht die gerenderten Bilder. Ich weiß nicht, was ich falsch mache.
Server-Medien-URL:
from Django.conf import settings
(r'^public/(?P<path>.*)$', 'Django.views.static.serve',{'document_root': settings.MEDIA_ROOT}),
Funktionsmodell:
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',)
Und das Ergebnis:
<img src="http://127.0.0.1:8000/public/product_images/6a00d8341c630a53ef0120a556b3b4970c.125x125.jpg" />
Dies ist in der Quelle für photologue (siehe models.py
, etwas angepasst, um irrelevantes Material zu entfernen):
def admin_thumbnail(self):
return u'<img src="%s" />' % (self.image.url)
admin_thumbnail.short_description = 'Thumbnail'
admin_thumbnail.allow_tags = True
Das list_display
-Bit sieht auch identisch aus, und ich weiß, dass es funktioniert. Das einzige, was mir verdächtig erscheint, ist Ihre Einrückung. Die beiden Zeilen, die image_img
am Ende Ihres models.py
-Codes beginnen, sollten mit def image_img(self):
auf gleicher Ebene sein:
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
Beachten Sie, dass in Django v.1.9
image_tag.allow_tags = True
ist depriziert und Sie sollten stattdessen format_html (), format_html_join () oder mark_safe () verwenden
Ihre model.py sollte also so aussehen:
...
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'
und in Ihrem admin.py hinzufügen:
list_display= ('image_img','product',)
readonly_fields = ('image_img',)
und um es im 'Bearbeitungsmodus' Ihres Admin-Panels hinzuzufügen, fügen Sie admin.py hinzu:
fields = ( 'image_img', )
Fügen Sie eine Methode in Ihrem Modell hinzu (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
und in Ihrem ModelAdmin (admin.py
) hinzufügen:
readonly_fields = ('image_tag',)
Als Ergänzung zu @dominic wollte ich dies in mehreren Modellen verwenden. Daher erstellte ich eine Funktion, die ich in jedem Modell aufrufen konnte, und gab das anzuzeigende Bild ein.
Zum Beispiel in einer App, die ich habe:
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)
mit image
eine Funktion von Frontpage, die ein Bild zurückgibt.
In einer anderen App habe ich:
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)
Dadurch kann ich das Bildobjekt und den short_description
angeben, während die Zwischenablage in einer anderen Datei bleibt. Die Funktion ist:
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
Mit Django-Imagekit können Sie jedes Bild wie folgt hinzufügen:
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']
Da die allow_tags veraltet sind, sollten Sie die format_html
-Funktion verwenden. Der Beispielcode sieht folgendermaßen aus:
models.py
datei:
class TestAdminModel(models.Model):
img = models.URLField()
admin.py
datei:
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)
Das Ergebnis sieht folgendermaßen aus:
Weitere Details finden Sie in der Django-Dokumentation.