我想创建一个包含 django-tables2 的表,以便不同的行具有不同的属性。
默认情况下,我得到
<tr class="odd">
或
<tr class="even">
如何为某些行指定自己的类?
同样,如果我有一个CheckBoxColumn并且我为此列指定了一些数据,它会进入值:
<input type="checkbox" name="col" value="123"/>
这非常适合确定选中了哪个复选框。但是,如何在创建表时将一些复选框设置为选中状态?
我的场景:用户从大表中选择一些行。例如,表格有
用户选择 aaple 5 和黄瓜7 。
然后我想显示所有苹果和所有黄瓜,因为用户至少挑选了一个苹果和至少一个黄瓜。这允许用户查看其他相关条目:
但是,我想通过使用css和/或显示一个选中的复选框来突出显示用户实际选择的条目:
答案 0 :(得分:8)
好吧,让我发布自己的解决方案。
我复制了标准模板 table.html 并对其进行了编辑。我只换了一行:
<tbody>
{% for row in table.page.object_list|default:table.rows %} {# support pagination #}
{% block table.tbody.row %}
<tr class="{{ row.tr_class }}"> <!-- CLASS FOR EACH ROW -->
而不是
<tr class="{% cycle "odd" "even" %}">
这样,您可以为表中的每一行设置不同的类。仍然需要在表类中添加一个不可见的列:
class MyTable(tables.Table):
tr_class=tables.Column(visible=False)
... # other columns
之后,无论何时创建表,都可以为任何特定行设置任何CSS类。请记住使用修改后的模板:
{% render_table div_table "modifiedtable.html" %}
当然,您也可以更改原始 table.html 。
有人能提出更优雅的解决方案吗?
总的来说,我觉得django_tables2仍然缺少许多重要的功能,所以每次我尝试做一些不平凡的事情时我都要重新发明轮子。
要使用此功能,您必须使用custom rendering。例如:
class MyTable(tables.Table):
tr_class=tables.Column(visible=False, empty_values=())
def render_tr_class(self, value):
if value.chosen == True:
return 'highlight'
tr
将获得课程highlight
。
答案 1 :(得分:5)
我有一个非常简单的解决方法
class MyTable(tables.Table):
source = tables.Column()
def render_source(self, value):
if value == 'some_value':
return mark_safe("<span class='highlight_this_row'>%s</span>" % (escape(value)))
else:
return value
然后,您可以使用 jQuery 来实际突出显示该行,而不是为自定义呈现创建完整的自定义HTML页面。
$('.highlight_this_row').parent().parent().addClass('highlight');
如果你没有上课&#34;突出显示&#34;已定义,您可以将其定义为:
<style>
.highlight{
background-color: black
}
</style>
答案 2 :(得分:4)
还有另一种方式(也不是很漂亮),但在这里你不必定义一个假的列。
首先,您扩展django_tables2.rows.BoundRows
:
class ColoredBoundRows(BoundRows):
def __iter__(self):
for record in self.data:
row = BoundRow(record, table=self.table)
row.style = 'some_class'
yield row
def __getitem__(self, key):
container = ColoredBoundRows if isinstance(key, slice) else BoundRow
return container(self.data[key], table=self.table)
然后让你的表使用它:
class YourTable(Table):
def __init__(self, *args, **kwargs):
super(YourTable, self).__init__(*args, **kwargs)
self.rows = ColoredBoundRows(data=self.data, table=self)
然后定义一个新模板(请注意,您只需要覆盖一个块):
{% extends "django_tables2/table.html" %}
{% block table.tbody.row %}
<tr class="{% cycle "odd" "even" %} {{ row.style }}">
{% for column, cell in row.items %}
<td {{ column.attrs.td.as_html }}>{{ cell }}</td>
{% endfor %}
</tr>
{% endblock table.tbody.row %}
答案 3 :(得分:0)
我实际上无法获得接受的答案来解决这个问题,也许django_tables2的最新版本有所不同。这是我的解决方案,它不需要修改tables.html
模板,并且基于documentation。
首先将row_attrs
定义为Meta类的一部分
class MyTable(tables.Table):
my_column = tables.Column()
class Meta:
row_attrs = {'class': my_custom_row_attrs}
然后,您可以定义MyTable
范围之外的函数,以根据各个行record
中的值来计算行属性
def my_custom_row_attrs(**kwargs):
'''My function to generate custom row attributes
'''
record = kwargs.get('record', None)
tr_class = ''
if record:
# Only do comparison if pat_date is present
if record.my_column.value == True:
tr_class = 'highlight'
return tr_class
我宁愿将所有这些功能保留在类中,但这似乎是避免修改任何其他内容的最佳方法。