Администратор Django TabularInline - есть ли хороший способ добавить пользовательский столбец HTML? - PullRequest
7 голосов
/ 09 марта 2011

У меня есть модель (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

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

1010 *, например *

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

Ответы [ 4 ]

15 голосов
/ 28 марта 2011

В соответствии с текущим 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)
14 голосов
/ 18 марта 2011

Что вы можете сделать, это создать метод в своем подклассе 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)
1 голос
/ 01 декабря 2017

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

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

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

В этом примере показано, как можно создать пользовательский столбец для 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)
0 голосов
/ 14 июня 2017

@ Лечуп правильный, за исключением того, что вам нужно:

readonly_fields = ('mycustomfield',)

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

...