django-tables2为不同的行指定不同的属性

时间:2012-03-01 23:10:52

标签: python css checkbox django-tables2

我想创建一个包含 django-tables2 的表,以便不同的行具有不同的属性。

默认情况下,我得到

<tr class="odd">

<tr class="even">

如何为某些行指定自己的类?

同样,如果我有一个CheckBoxColumn并且我为此列指定了一些数据,它会进入

<input type="checkbox" name="col" value="123"/>

这非常适合确定选中了哪个复选框。但是,如何在创建表时将一些复选框设置为选中状态?

我的场景:用户从大表中选择一些行。例如,表格有

  • orange 1
  • orange 2
  • apple 5
  • orange 3
  • apple 4
  • 黄瓜7
  • aaple 1

用户选择 aaple 5 黄瓜7

然后我想显示所有苹果和所有黄瓜,因为用户至少挑选了一个苹果和至少一个黄瓜。这允许用户查看其他相关条目:

  • apple 5
  • apple 4
  • 黄瓜7

但是,我想通过使用css和/或显示一个选中的复选框来突出显示用户实际选择的条目:

  • apple 5
  • apple 4
  • 黄瓜7

4 个答案:

答案 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仍然缺少许多重要的功能,所以每次我尝试做一些不平凡的事情时我都要重新发明轮子。

定义tr_class

要使用此功能,您必须使用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

我宁愿将所有这些功能保留在类中,但这似乎是避免修改任何其他内容的最佳方法。