在Django管理员中显示图片-多对多内联管理员视图

时间:2019-03-20 12:04:57

标签: django django-models django-admin

我有以下型号:

class AModel(BaseModel):
    a_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)
    a_images = models.ManyToManyField(BModel)

class BModel(BaseModel):
    images = ImageField(upload_to='/')

我想以AModel管理员形式显示BModel图像。我可以使用

class BModelInline(admin.TabularInline):
    model = AModel.a_images.through

如何在AModel表单管理员中以表格格式显示图像预览?我已经尝试了覆盖formfield,但是似乎不起作用。

formfield_overrides = { models.ImageField: {'widget': AdminImageWidget}}

class AdminImageWidget(AdminFileWidget):
    def render(self, name, value, attrs=None):
        output = []
        if value and getattr(value, "url", None):
            image_url = value.url
            file_name=str(value)
            output.append(u' <a href="%s" target="_blank"><img src="%s" alt="%s" width="150px"/></a> ' % \
                (image_url, image_url, file_name))
        output.append(super(AdminFileWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

1 个答案:

答案 0 :(得分:0)

如果您只想在管理模型中显示AModel的图像,是否尝试过类似的方法?:

class AModelAdmin(admin.ModelAdmin):
    readonly_fields = ('images',)

    def images(self, obj):
        html = '<a href="{url}" target="_blank"><img src="{url}" /></a>'
        return format_html(''.join(html.format(url=image.url) for image in obj.a_images))

也可以使用Django模型中的方法来实现