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