Как отобразить несколько строк текста в админке django для заголовков?
Подобные вопросы уже задавались для полей данных, как в Здесь и Здесь
.
Но как разделить заголовок на несколько строк?
Рассматриваю приложение Django с моделью и админкой, настроенными следующим образом:
models.py
from django.db import models
class TaskItem(models.Model):
group = models.ForeignKey(TaskGroup, on_delete=models.CASCADE)
title = models.CharField(max_length=32, null=False, blank=False)
description = models.CharField(max_length=45, null=False, blank=False)
reward = models.IntegerField(default=1000, null=False, blank=False)
admin.py
class TaskItemAdmin(admin.ModelAdmin):
list_display=['title', 'group', 'reward']
list_filter=('group',)
Как переименовать заголовки в Task Title
, Task Group
и Task Reward
с переносом строк?
Для того чтобы иметь собственные имена для заголовков, вы должны использовать декоратор Display.
Подобно этому:
(я рекомендую добавлять префикс _
к столбцам, которые вы настраиваете с помощью декоратора, чтобы избежать путаницы с немодифицированными столбцами)
class TaskItemAdmin(admin.ModelAdmin):
list_display=['_title', '_group', '_reward']
list_filter=('group',)
@admin.display(description='Task Title')
def _title(self, obj):
return obj.title
@admin.display(description='Task Group')
def _group(self, obj):
return obj.group
@admin.display(description='Task Reward')
def _reward(self, obj):
return obj.reward
Это настроит внешний вид заголовков на тот, который мы только что написали, однако если вы попытаетесь использовать \n
переносы строк, как @admin.display(description='Task\nReward')
, или HTML </br>
теги, как @admin.display(description='Task</br>Reward')
, в секции декоратора, вы можете заметить, что ни один из них не работает!
Это происходит потому, что Django автоматически экранирует HTML по некоторым причинам, одна из которых - инъекция кода.
Поэтому вы можете использовать format_html для частичного включения форматирования HTML в вашем коде.
Это похоже на str.format(), за исключением того, что подходит для построения HTML-фрагментов.
Так что вы можете написать что-то вроде этого:
admin.py
class TaskItemAdmin(admin.ModelAdmin):
list_display=['_title', '_group', '_reward']
list_filter=('group',)
@admin.display(description=format_html('{}</br>{}', 'Task', 'Title'))
def _title(self, obj):
return obj.title
@admin.display(description=format_html('{}</br>{}', 'Task', 'Group'))
def _group(self, obj):
return obj.group
@admin.display(description=format_html('{}</br>{}', 'Task', 'Reward'))
def _reward(self, obj):
return obj.reward