如何根据值自定义列?

How do I customize a column based on its value?

使用 django-tables2 很容易从你的模型中得到一个 table。在我的例子中,我需要根据其值对我的 table 列之一进行格式化。

在我当前的 html table 中,它看起来像下面这样:

{% if record.status|stringformat:"s" == "New" %}
    <td class="bg-success></td>

如果值为新,则单元格背景应为绿色。

据我所知,可能有 3 种方法可以做这样的事情:

更新的解决方案:

1.Create 一个 class 和一个 css 具有适当背景颜色的规则并将其添加到列中:

class MyTable(tables.Table):    
    status = tables.Column(attrs={"class": lambda record: record.status})

.New {
background-color: green
}

这种方式可行,尽管我认为 record.status 可以在没有 lambda 的情况下可行。

2.You 可以指定如何呈现列:

class MyTable(tables.Table):    
    status = tables.Column()

    def render_status(self, value):
        if value.name == "New":
            change class accordingly

class 相应的部分我没有理解。

您还可以创建自定义列:

class StatusColumn(tables.Column):
    def render(self, value):
        if value == "New":
            return format_html('<span class="text-success">{}</span>', value)

我使用 span 标签完成这项工作,以传递 bootstrap class 来格式化单元格。

3.Use 一个 TemplateColumn 并传递 html:

class MyTable(tables.Table):  
    status = tables.TemplateColumn("""
    {% if record.status|stringformat:"s" == "New" %}
        <td class="bg-success"></th>
    {% else %}
        <td class="bg-danger"></th>
    {% endif %}
    """)

这样就创建了一个格式正确的新列。

我仍在寻找如何做到这一点,如果有任何帮助,我将不胜感激。

根据您的具体需求,有不同的解决方案。

1。更改单元格的外观 (<td></td>)

如果你想给<td>标签添加属性,你必须使用django-tables2调用的东西column attributes.

它支持固定值,但也允许可调用对象使用正在呈现的记录的某些值。 举例来说,您有一个包含字段 color 的记录,并且您希望将该颜色用作单元格的背景颜色。

class Table(tables.Table):
    person = tables.Column(attrs={
        'td': {
            'class': 'person-column',
            'style': lambda record: 'background-color: {}'.format(record.color)
        }
    })

或更具体地针对您的示例:

class MyTable(tables.Table):    
    status = tables.Column(attrs={'td': {'class': lambda value: 'bg-success' if value == 'New' else 'bg-danger' }})

或没有 lambda:

def status_attr(record):
    return 'bg-success' if value == 'New' else 'bg-danger'

class MyTable(tables.Table):    
    status = tables.Column(attrs={'td': {'class': status_attr}})

2。更改单元格

内容

我所说的内容是指 <td></td> 标签内的所有内容。 django-tables2 的 API 允许通过多种方式更改单元格的内容,在文档中称为 custom data

您的解决方案 2 和 3 已经显示了执行此操作的方法,但是,您不能以这些方式更改单元格属性。您可能能够实现这样的输出 <td><td class="bg-success">...</td></td>,它可能看起来像您想要的,但无效 HTML.