在 django admin 中,你如何访问子模型中的函数?

In django admin how do you access a function in a child model?

我想访问我的图像模型的缩略图功能,以便在我的 tabularInline 中预览。

在admin.py

class BlogWidgetCarouselInline(admin.TabularInline):
    model = BlogWidgetCarousel
    extra = 0
    readonly_fields = ('display_as', 'thumb', 'print_thumbs',)

    def display_as(self, instance):
        return instance.display()
    display_as.allow_tags = True

    def thumb(self, instance):
        return instance.Image.thumb() #Does not work

    def print_thumbs(self, instance):
        return instance.print_thumb() #Neither does this

在models.py

class BlogWidgetCarousel(models.Model):
    entry = models.TextField()
    blog = models.ForeignKey(Blog, blank=True, null=True)
    position = models.PositiveSmallIntegerField("Position")
    images = models.ManyToManyField("Image")

    class Meta:
        ordering = ('position', )

    def display(self):
        return self.entry
    display.allow_tags = True

    def print_thumb(self):
        return self.images.thumb

class Image(models.Model):
    title = models.CharField(max_length=60, blank=False, null=False)
    image = models.ImageField(upload_to="images/")

    def thumb(self):
        return '<a href="{0}"><img src="{0}"></a>'.format(MEDIA_URL + str(self.image))
    thumb.allow_tags = True

BlogWidgetCarousel 上的 images 字段是 ManyToManyField,return 是 Image 个对象的查询集。

所以,首先,您需要查看是否有任何图像实例要显示,然后获取第一个,或者您想要使用的任何一个:

class Image(models.Model):
    . . .

    def thumb(self):
        return '<a href="{0}"><img src="{0}"></a>'.format(self.image.url)


class BlogWidgetCarouselInline(admin.TabularInline):
 . . .

    def thumb(self):
        images = self.images.all()
        if images:
            return images[0].thumb()
        return ''

在此示例中,return 编辑了一个空字符串,但您也可以轻松地 return "default" 缩略图路径。我不太喜欢在 Python 代码中呈现 HTML,所以我个人会将该部分移动到模板片段中:

from django.template.defaultfilters import mark_safe
from django.template.loader import render_to_string


class Image(models.Model)
    . . .

    def thumb(self):
        return mark_safe(render_to_string('_thumb.html', {'image': images[0].image}))


# _thumb.html

<a href="{{ image.url }}"><img src="{{ image.url }}"></a>