Django admin TabularInline-есть ли хороший способ добавить пользовательский столбец html?

у меня есть модель (Entry), который содержит простое свойство:

@property
def image(self):
        return str(self.id)+"_"+self.round.season.name+"_"+self.round.theme+"_"+self.person.name

Я использую это для создания имени определенного файла изображения на диске. Поэтому я знаю, что в /path/to/images/(model.image()).jpg

Я могу отобразить само свойство raw image в макете TabularInline на странице администратора, добавив его в коллекцию readonly_fields, но как я могу получить столбец, который имел Пользовательский html, обернутый вокруг модели собственность?

например

<img src="/images/{{model.image}}.jpg" />

4 ответов


что вы можете сделать, это создать метод в вашей TabularInline подкласс, который возвращает HTML, который вы хотите, а затем используйте имя этого метода вместо image на ImageInline.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 в модель.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',)

определено в Inline для более поздних версий django (+1.4)


ответ Лечупа не работает для меня, я использую Django 1.11.7. Я нашел способ обойти.

Допустим у меня есть 2 таблицы: кампания и статьи одна кампания имеет много статей. Я хочу показать статьи при просмотре конкретной кампании.

статья таблицы имеет столбец с именем результат, который является поплавок. Я хочу округлить его до 2 десятичных знаков при просмотре в Django admin.

этот пример показывает, как можно сделать пользовательский столбец для TabularInline в админке Django.

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)