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

时间:2015-06-13 19:03:03

标签: django django-admin

我想访问我的Image模型的缩略图功能,以便在我的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

1 个答案:

答案 0 :(得分:1)

images上的BlogWidgetCarousel字段为ManyToManyField,返回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 ''

在此示例中,返回一个空字符串,但您可以轻松返回“默认”缩略图路径。我不是在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>