如何在Django管理界面中显示ImageField()中的图像?

时间:2019-08-07 10:34:50

标签: django

我想在Django管理界面中显示一个类似缩略图的小图像。我应该怎么做?而且它似乎没有显示任何SVG文件。

models.py:

from django.db import models
import os
from PIL import Image
from datetime import date
import datetime
from .validators import validate_file_extension
import base64

def get_directory_path(instance, filename):

    today = date.today()
    t = datetime.datetime.now() 
    day, month, year = today.day, today.month, today.year
    hour, minutes, seconds = t.hour, t.minute, t.second
filename = str(day) + str(month) + str(year) + str(hour) + str(minutes) + str(seconds) + '.png'
    dir = 'media'
    path = '{0}/{1}'.format(dir, filename)
    return path

class Image(models.Model):
    image = models.FileField(upload_to = get_directory_path, null = True , validators=[validate_file_extension])
    created_date = models.DateTimeField(auto_now = True)

    def __str__(self):
        return str(self.id)

1 个答案:

答案 0 :(得分:0)

您可以在类Image中创建一个虚拟属性,并将其作为只读字段添加到ImageAdmin中。

这里是一个例子:

from django.db import models
from django.utils.functional import cached_property
from django.utils.html import format_html

class Image(models.Model):
    image = models.FileField(
        upload_to = get_directory_path,
        null = True,
        validators=[validate_file_extension]
    )
    created_date = models.DateTimeField(auto_now = True)

    def __str__(self):
        return str(self.id)

    @cached_property
    def display_image(self):
        html = '<img src="{img}">'
        if self.image:
            return format_html(html, img=self.image.url)
        return format_html('<strong>There is no image for this entry.<strong>')
    display_image.short_description = 'Display image'

方法display_image可作为常规属性访问。我们将检查字段image是否具有真实值(即不为null或空白),并返回包含img标签的字符串,否则我们将输出显示无图像的文本。

现在在管理类中,您可以执行以下操作:

class ImageAdmin(admin.ModelAdmin):
    readonly_fields = ('display_image',)

当然,您必须在管理员中定义所有其他内容,上面的代码只是如何包含虚拟属性display_image的示例。

希望这对您有所帮助,并为您提供想法。

编辑:

您可以扩展<img src="{img}">并提供所需的其他功能。您可以为classidalt等添加属性。如果要为图像设置固定的大小,可以创建CSS类,例如:

.admin-image {
     height: 200px;
     width: 300px;
}

并在Django模型中修改该行:

html = '<img src="{img}" class="admin-image">'