Как отобразить несколько строк текста в админке 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

И в результате получится что-то похожее на:
Django admin panel showing the result

Вернуться на верх