我想访问我的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
答案 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>