8

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

默认情况下,我得到

<tr class="odd">

或者

<tr class="even">

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

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

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

这对于确定选中了哪个复选框非常有用。但是,如何在创建表时将某些复选框设置为选中?

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

  • 橙色 1
  • 橙色 2
  • 苹果 5
  • 橙色 3
  • 苹果 4
  • 黄瓜 7
  • 苹果 1

用户选择aaple 5cucumber 7

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

  • 苹果 5
  • 苹果 4
  • 黄瓜 7

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

  • 苹果 5
  • 苹果 4
  • 黄瓜 7
4

4 回答 4

9

好吧,让我发布我自己的解决方案。

我已经复制了标准模板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

要使用它,您必须使用自定义渲染。例如:

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

于 2012-03-13T18:42:18.687 回答
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

然后,无需为自定义呈现创建完整的自定义 HTML 页面,您可以只使用jQuery实际突出显示该行。

$('.highlight_this_row').parent().parent().addClass('highlight');

如果您没有定义类“highlight”,则可以将其定义为:

<style>
    .highlight{
        background-color: black
    }
</style>
于 2015-09-24T06:56:56.330 回答
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 %}
于 2013-03-14T18:51:27.853 回答
0

我实际上无法得到公认的答案,也许最新版本的 django_tables2 是不同的。这是我的解决方案,不需要修改tables.html模板,基于文档

首先定义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

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

于 2018-10-02T07:56:23.873 回答