如何根据其值自定义列?

时间:2018-03-28 22:53:47

标签: django django-tables2

使用django-tables2从您的模型中获取表格非常容易。在我的情况下,我需要根据其值来格式化我的一个表列。

在我当前的html表中,它将如下所示:

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

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

根据我的发现,可能有3种方法可以做这样的事情:

更新了解决方案:

1.使用适当的背景颜色创建一个类和一个css规则,并将其添加到列中:

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

.New {
background-color: green
}

这种方式有效,但我认为record.status可以工作,没有lambda。

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

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

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

因此,改变类部分是我的选择。

您还可以创建自定义列:

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

我使用span标记来传递一个bootstrap类来格式化单元格。

3.使用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 个答案:

答案 0 :(得分:1)

根据您的确切需求,有不同的解决方案。

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

如果要向<td>标记添加属性,则必须使用django-tables2调用column attributes

它支持固定值,但也允许callable使用正在呈现的记录的某些值。 比方说,您有一个包含字段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。