webentwicklung-frage-antwort-db.com.de

Django-Admin und zeigen Miniaturbilder

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

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
68
Dominic Rodger

Update v. 1.9

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

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

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
6
saul.shanabrook

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

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:  enter image description here

Weitere Details finden Sie in der Django-Dokumentation.

0
ramwin