如何根据值自定义列?
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.
使用 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.