Django admin TabularInline - 是否有添加自定义html列的好方法?
问题描述:
我有其中包含一个简单的属性模型(Entry
):Django admin TabularInline - 是否有添加自定义html列的好方法?
@property
def image(self):
return str(self.id)+"_"+self.round.season.name+"_"+self.round.theme+"_"+self.person.name
我用这个来建立磁盘上的一个特定的图像文件的名称。所以我知道这将是一个图像在/path/to/images/(model.image()).jpg
我可以显示原始图像属性本身在管理页面上的TabularInline布局,通过将其添加到readonly_fields集合,但我怎么会得到一个列有自定义的HTML包裹模型属性?
例如
<img src="/images/{{model.image}}.jpg" />
答
你可以做什么是你的TabularInline
子类,返回你想要的HTML创建一个方法,然后在ImageInline
使用该方法的名称代替image
。 fields
:
from django.utils.safestring import mark_safe
class ImageInline(admin.TabularInline):
...
fields = (..., 'render_image')
def render_image(self, obj):
return mark_safe("""<img src="/images/%s.jpg" />""" % obj.image)
答
根据目前的Django 1.2+我有错误“表没有这样字段render_image”。解决方法很简单把render_image功能分为model.Admin不是在你的内联形式,第二件事是字段和readonly_fields在你的内联表格设置...所以在这里你有什么我已经结束了:
class OfferPropertyInline(admin.TabularInline):
model = OfferProperty
fields=('property_value',)
readonly_fields = ('property_value',)
class OfferAdmin(admin.ModelAdmin):
inlines = [
OfferPropertyInline
]
def property_value(self,obj):
return obj.get_value()
admin.site.register(Offer, OfferAdmin)
答
@lechup正确的,除非你需要:
readonly_fields = ('mycustomfield',)
在联定义为更高版本的Django的(+1.4)
答
Lechup的回答没有为我工作,我使用Django 1.11.7。我发现这种方法可以解决问题。
假设我有两个表格:活动和文章,一个活动有很多文章。我想在浏览特定广告系列时显示文章。
表文章有一列名为得分,这是一个浮点数。在Django admin中查看时,我想将它舍入到小数点后两位。
此示例显示如何在Django admin中为TabularInline制作自定义列。
class Article(models.Model):
title = models.TextField(null=False)
url = models.TextField()
score = models.FloatField(null=True)
def __str__(self):
return self.title
def display_score(self):
if self.score:
return round(self.score, 2)
return self.score
display_score.short_description = 'Score'
class ArticleInline(admin.TabularInline):
model = Article
readonly_fields = ('title', 'url', 'display_score')
fields = ('title', 'url', 'display_score')
class CampaignAdmin(admin.ModelAdmin):
inlines = [ArticleInline]
admin.site.register(Campaign, CampaignAdmin)
当我尝试,我得到'“为TheModelHere' – Matt 2014-07-14 23:04:29
@马特指定的未知领域(S)(render_image),那是因为你需要指定它的只读:'readonly_fields =(..., 'render_image')' – dragostis 2014-08-29 12:51:35