Как покрасить ячейку таблицы в зависимости от содержания ячейки в админке Django
Мучаюсь с проблемой уже 3 дня. Стоит django-suit. Он умеет закрашивать ячейки и строки в нужный цвет - и все вроде работает, но только с обычными полями - если контент берется из другой модели через foreign key, то чтобы я не выдумывал - class css не подтягивается. Привожу только выжимку из кода - только затронутые кодом модели, а до этой модели используется еще абстрактный класс. На результат вроде влиять не должно. Прошу помочь - понимаю что решение очень простое, но никак не добиться работоспособности. Помогите пожалуйста новичку. Для меня Python еще язык новый.
Версия питона: 3.8.1 Версия django: 3.0.2
models.py:
from django.db import models
from imagekit.models import ImageSpecField, ProcessedImageField
from imagekit.processors import ResizeToFill
class Function(models.Model):
function_name = models.TextField("Функция устройства", max_length = 30, unique=True, help_text="Поле должно быть уникальным. ", )
def __str__(self):
return self.function_name
class Meta:
verbose_name = 'Функция устройства'
verbose_name_plural = 'Функции устройств'
class PersonalComputer(AbstractDevices):
inv_number = models.CharField("Инвентарный номер", max_length = 30, unique=True, help_text="Поле должно быть уникальным. ")
invenory_pass =models.BooleanField(verbose_name='Инвентаризация:', default=False, help_text="Отметить если устройство прошло инвентаризацию ")
decomission_on =models.BooleanField(verbose_name='Списан:', default=False, help_text="Отметить если устройство списано")
pc_type = models.ForeignKey(PcType, blank = True, null = True, on_delete=models.DO_NOTHING, verbose_name='Тип компьютера:')
function_name = models.ForeignKey(Function, blank=True, null = True, on_delete=models.DO_NOTHING, verbose_name='Функция устройства:')
def __str__(self):
return self.inv_number
admin.py
PersonalComputerForm = select2_modelform(PersonalComputer, attrs={'width': '250px'})
class PersonalComputerAdmin(ImportExportModelAdmin, admin.ModelAdmin):
resource_class = PersonalComputerResource
form = PersonalComputerForm
######## Блок отображения списка компьютеров ##########
### Подсоединяем встроенные формы ###
inlines = (EthernetInline, MonitorInline, ProjectorInline, PrinterInline, MultimediaDeviceInline)
#form = PersonalComputerForm
### Указываем поля, которые хотим видеть на странице списка компьютеров ###
list_display = ['inv_number', 'decomission_on', 'invenory_pass', 'global_inv_number', 'pc_type','colored_function_name', 'Кабинет', 'supplier_name', 'manufacturer_name', 'device_model', 'serial_number', 'get_os', 'owner',]
### Включаем поле поиска и указываем поля, по которым будет происходить поиск ###
list_editable = ['invenory_pass', 'decomission_on']
search_fields = ['inv_number', 'global_inv_number', 'device_model__device_model', 'serial_number', 'manufacturer_name__manufacturer_name', 'supplier_name__supplier_name', 'owner__owner', ]
### Включаем фильтр по некоторым полям. ###
list_filter = (
('pc_type', admin.RelatedOnlyFieldListFilter),
('function_name', admin.RelatedOnlyFieldListFilter),
('supplier_name', admin.RelatedOnlyFieldListFilter),
('os_name', admin.RelatedOnlyFieldListFilter),
('owner', admin.RelatedOnlyFieldListFilter),
('invenory_pass'),
StatusFilter,
)
### Переносим фильтр к форме поиска в горизонтальное положение ###
suit_list_filter_horizontal = ('pc_type', 'function_name', 'supplier_name', 'owner', 'os_name', 'invenory_pass', 'decomission_on')
def get_os(self, obj):
return ",\n\n".join([p.os_name for p in obj.os_name.all()])
def get_function_name(self, obj):
return obj.function_name
### Окрашиваем ячейки - рабочий вариант###
def suit_cell_attributes(self, obj, column):
if column == 'invenory_pass':
cls = 'text-xs-center'
if obj.invenory_pass == 1:
cls += ' table-info'
return {'class': cls}
### Окрашиваем строку - тоже рабочий ###
def suit_row_attributes(self, obj, request):
decomission_on = {
1: 'table-danger',
}
css_class = decomission_on.get(obj.decomission_on)
if css_class:
return {'class': css_class}
### ПРоблемное место: не окрашивается ячейка ###
def colored_function_name(self, obj, column):
if column == 'function_name':
cls = 'text-xs-center'
if obj.function_name == "Sysadmin":
### сюда пробовал вставлять и просто id foreign key цифрой (if obj.function_name == 14)
### Также пробовал переводить сначала результат в string а потом делать проверку - не выходит... :(
cls += ' table-warning'
return {'class': cls}