django admin:根据内容更改单元格值颜色

django admin: change cell value color depending on content

我正在使用 django admin,我想更改 "estado_material" 字段值的字体颜色,如果它们可用 "Disponible" 或不可用 "En préstamo"。我的 models.py:

from django.db import models

class Material(models.Model):
    identificacion=models.CharField(max_length=30, verbose_name='Identificación del material')
    num_com=models.CharField(max_length=30, verbose_name='Número')
    nombre_sp=models.CharField(max_length=30, verbose_name='Nombre científico')
    coleccion=models.CharField(max_length=30, verbose_name='Colección')
    descripcion=models.CharField(max_length=1000, verbose_name='Descripción')
    localidad=models.CharField(max_length=30, verbose_name='Localidad')
    estratigrafia=models.CharField(max_length=1000, verbose_name='Estratigrafía')
    colector=models.CharField(max_length=130, verbose_name='Colector/es')
    observaciones=models.CharField(max_length=1000, verbose_name='Observación')
    ubicacion=models.CharField(max_length=130, verbose_name='Ubicación')
    class Meta:
         verbose_name = "Material"
         verbose_name_plural = "Materiales"

    def __str__(self):
        return self.num_com

    def estado_material(self):
        if Prestamos.objects.filter(material__num_com=self.num_com).exists():
            return "En préstamo"
        else:
            return "Disponible"

和我的 admin.py:

from django.contrib import admin
from django.forms import TextInput, Textarea
from django.db import models


from coleccion.models import Material, 

class MaterialAdmin(admin.ModelAdmin):
    list_display = ('num_com', 'identificacion', 'descripcion','ubicacion', 'estado_material')
    search_fields = ('num_com', 'identificacion', 'descripcion','ubicacion')
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'40'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':80})},
    }

estado_material 可以使用 django.utils.html 中的 format_html 方法更改为如下内容:

from django.utils.html import format_html
...
    def estado_material(self):
        if Prestamos.objects.filter(material__num_com=self.num_com).exists():
            result = "En préstamo"
        else:
            result = "Disponible"
        return format_html('<span style="color: {};">{}</span>',
                       'green' if  result == 'Disponible' else 'red',
                       result)

Django 1.9 之前可以将 allow_tags 属性添加到方法中以防止自动转义 - 现在已弃用并且 format_html 就足够了。