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)