如何在Django Admin的“修改列表”页面显示上传的图片?

ugmeyewa  于 2023-01-18  发布在  Go
关注(0)|答案(9)|浏览(226)

我尝试在Django Admin的**"更改列表"页面**显示上传的图片:

这是我的代码如下:

# "models.py"

from django.db import models

class Product(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField(decimal_places=2, max_digits=5)
    image = models.ImageField()
        
    def __str__(self):
        return self.name
# "admin.py"

from django.contrib import admin
from .models import Product

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'price', 'image',)

那么,我怎样才能在Django Admin的**"Change List"页面**显示上传的图片呢?

8wigbo56

8wigbo561#

您可以使用其他名称创建模型示例方法,允许HTML标记用于其输出,并将此方法添加为列表字段。以下是一个示例:
首先添加一个新方法,返回包含图像的HTML:

class Product(models.Model):
    ...
    def admin_image(self):
        return '<img src="%s"/>' % self.img
    admin_image.allow_tags = True

然后将此方法添加到列表中:

class ProductAdmin(admin.ModelAdmin):    
    ...
    list_display = ('name', 'price', 'image', 'admin_image')
a7qyws3x

a7qyws3x2#

2020年更新

因为这个答案最近得到了很多关注,我决定做一个小的编辑。根据django文档,建议使用函数format_html。正如@chem1st建议的,如果你只需要它来管理,所有的东西都可以在admin.py中完成。

我的models.py

from django.db import models

class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField()
    price = models.DecimalField(decimal_places = 2, max_digits = 20, default = 00.00)
    image = models.ImageField(upload_to=change_image_name, null=True, blank=True)

    def __str__(self):
        return self.title

我的admin.py

from django.contrib import admin
from django.utils.html import format_html

from .models import Product

class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'price', 'image_tag')

    def image_tag(self,obj):
        return format_html('<img src="{0}" style="width: 45px; height:45px;" />'.format(obj.image.url))

admin.site.register(Product, ProductAdmin)

更新django 2.0.6

我在最新的django2.0.6中解决了这个问题。我想在django-admin中有一个列表视图中的图像缩略图。

下面的图片是我的默认管理员列表视图。

这是我的小精灵

from django.db import models
from django.utils.safestring import mark_safe

# Create your models here.

class Product(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField()
    price = models.DecimalField(decimal_places = 2, max_digits = 20, default = 00.00)
    image = models.ImageField(upload_to=change_image_name, null=True, blank=True)

    def image_tag(self):
        if self.image:
            return mark_safe('<img src="%s" style="width: 45px; height:45px;" />' % self.image.url)
        else:
            return 'No Image Found'
    image_tag.short_description = 'Image'
    

    def __str__(self):
        return self.title

请注意,我必须对图像字符串使用mark_safe(),否则您将在django-admin中得到转义的html代码,而不是缩略图

终于,这是我的admin.py

from django.contrib import admin

from .models import Product
# Register your models here.
class ProductAdmin(admin.ModelAdmin):
    list_display = ('title', 'description', 'price', 'image_tag')

admin.site.register(Product, ProductAdmin)

在这里,我们还必须注册ProductAdmin类,我不知道这一点,它不起作用。

这是结果:

btxsgosb

btxsgosb3#

def image_tag(self, obj):
    return u'<img src="%s" />' % obj.image

image_tag.short_description = 'Image'
image_tag.allow_tags = True

并在www.example.com中admin.py添加:

readonly_fields = ('image_tag',)
hc2pp10m

hc2pp10m4#

你也可以直接在管理中添加镜像

class ProductAdmin(admin.ModelAdmin):
        
     def admin_image(self, obj):                       
        return '<img src="%s"/>' % obj.img
     admin_image.allow_tags = True

     list_display = ('name', 'price', 'image', 'admin_image')
ct3nt3jp

ct3nt3jp5#

(我使用Django 1.5)除了按照公认答案中的步骤操作外,我还必须将图像标记为“安全”
为此,用django.utils.safestring包的mark_safe方法 Package 返回值。
代码示例:https://stackoverflow.com/a/14075441/1063031
Django文档:https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#filters-and-auto-escaping

2wnc66cl

2wnc66cl6#

你可以为你的模型覆盖django管理视图,更多细节请访问http://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates。
简而言之,您需要创建一个模板:templates/admin/your_app/article/change_form. html然后添加html来显示图像。

r1zhe5dt

r1zhe5dt7#

根据@TomRavn的评论,mark_safe对我有效。
https://docs.djangoproject.com/en/3.1/ref/utils/#module-django.utils.html

eanckbw9

eanckbw98#

models.py
from django.utils.html import format_html

class Test(models.Model):
    title                   = ...
    photo                   = ...
    
    def image(self):
        return format_html('<img src="%s"/>' % self.photo.url)
admin.py
@admin.register(models.Test)
class testAdmin(admin.ModelAdmin):
    list_display =    ('title','image')
bwitn5fc

bwitn5fc9#

您需要使用image_tag()创建**image_tag列**,然后将其分配给list_display,如下所示:

# "admin.py"

from django.contrib import admin
from .models import Product
from django.utils.html import format_html

@admin.register(Product)
class ProductAdmin(admin.ModelAdmin):         # Here
    list_display = ('name', 'price', 'image', 'image_tag')

    def image_tag(self, obj): # Here
        return format_html(
            f'''<a href="{obj.image.url}" target="_blank">
                  <img 
                    src="{obj.image.url}" alt="{obj.image}" 
                    width="50" height="50"
                    style="object-fit: cover;"
                  />
                </a>''')

然后,您可以在Django Admin的**“Change List”页面**显示上传的图片,如下所示:

您也可以在Django Admin的**“Change”页面**中看到我的回答,解释如何显示上传的图像。

相关问题