在管理员中显示外键的值(URL /缩略图)

时间:2015-10-18 03:15:48

标签: django django-models

我想在Django Admin中显示一个小预览图像。我做了这个hack,当密钥在实际模型本身时就可以工作。

class Product(models.Model):
    prod_name = models.CharField ("Name", max_length=130)
    image = models.URLField(max_length=340, blank=True, null=true)
    def admin_image(self):
        return '<center><a href="%s" target="_blank"><img src="%s"/width="100px"></a></center>' %(self.image, self.image)
    admin_image.allow_tags = True

但是,我希望它能够从外键显示图像(读取URL)。我试过以下但没有运气:

class Product_Option(models.Model):
    colour = models.CharField (max_length=80, blank=True, null=True)
    size = models.CharField (max_length=80, blank=True, null=True)
    image_default = models.URLField(max_length=340, blank=True, null=True) # SHOW this image by

class Product(models.Model):
    prod_name = models.CharField ("Name", max_length=130)
    image = models.URLField(max_length=340, blank=True, null=true)
    Default_Image = models.ForeignKey(Product_Option, blank=True, null= True)

Admin.py

class ProductAdmin(ImportExportModelAdmin):
    resource_class = ProductResource
    def admin_image(self, obj):
        return '<center><a href="%s" target="_blank"><img src="%s"/width="100px"></a></center>' %(obj.Stock_Image.image_default.url, obj.Stock_Image.image_default.url)
    admin_image.allow_tags = True
    list_display = ('prod_name','admin_image')
    readonly_fields = ('admin_image',)

1 个答案:

答案 0 :(得分:1)

您的代码有点令人困惑,您应该小心将HTML类型代码放入模型中。话虽如此,假设您尝试通过外键关系向管理员添加缩略图,这将是最简单的方法:

from django.utils.html import format_html

class ProductAdmin(ImportExportModelAdmin):
    resource_class = ProductResource
    list_display = ('prod_name', 'admin_image')
    readonly_fields = ('admin_image',)

    def admin_image(self, obj):
        return format_html('<center><a href="{0}" target="_blank"><img src="{1}"/width="100px"></a></center>', obj.Default_Image.image_default, obj.Default_Image.image_default)
        admin_image.allow_tags = True

注意:请注意format_html()的使用。在这些情况下始终使用它来避免漏洞,因为它可能会逃脱恶意代码。

此外,您尝试使用image_default.urlImageField仅存在于URLField,而不是image_default。我删除了它,只支持{{1}}。