2011-03-09 89 views
7

我有其中包含一个简单的属性模型(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" /> 

回答

10

你可以做什么是你的TabularInline子类,返回你想要的HTML创建一个方法,然后在ImageInline使用该方法的名称代替imagefields

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) 
+7

当我尝试,我得到'“为TheModelHere' – Matt 2014-07-14 23:04:29

+14

@马特指定的未知领域(S)(render_image),那是因为你需要指定它的只读:'readonly_fields =(..., 'render_image')' – dragostis 2014-08-29 12:51:35

15

根据目前的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) 
+0

这真是太好了!看起来像django管理员实现中的一个粗糙的边缘,如果它可以在基本管理员类中工作,它也应该以内联方式工作... – xaralis 2012-01-09 15:29:45

+3

在1.4中看起来不起作用 – Ash 2013-10-18 14:26:17

0

@lechup正确的,除非你需要:

readonly_fields = ('mycustomfield',) 

在联定义为更高版本的Django的(+1.4)

0

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) 
相关问题