8

異なる行が異なるプロパティを持つように、 django-tables2でテーブルを作成したいと思います。

デフォルトでは、どちらかを取得します

<tr class="odd">

また

<tr class="even">

一部の行に独自のクラスを指定するにはどうすればよいですか?

同様に、CheckBoxColumn があり、この列にデータを指定した場合、は次のようになります。

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

これは、どのチェックボックスがチェックされたかを把握するのに最適です。ただし、テーブルの作成時にチェックボックスをオンにするにはどうすればよいですか?

私のシナリオ: ユーザーは大きなテーブルからいくつかの行を選択します。たとえば、テーブルには

  • オレンジ 1
  • オレンジ 2
  • りんご 5
  • オレンジ 3
  • りんご 4
  • きゅうり 7
  • アップル 1

ユーザーは、リンゴ 5キュウリ 7を選びます。

次に、ユーザーが少なくとも 1 つのリンゴと少なくとも 1 つのキュウリを選んだので、すべてのリンゴとすべてのキュウリを表示したいと思います。これにより、ユーザーは他の関連エントリを表示できます。

  • りんご 5
  • りんご 4
  • きゅうり 7

ただし、css を使用したり、チェックボックスを表示したりして、ユーザーが実際に選択したエントリを強調表示したいと思います。

  • りんご 5
  • りんご 4
  • きゅうり 7
4

4 に答える 4

9

さて、私自身の解決策を投稿させてください。

標準テンプレートtable.htmlをコピーして編集しました。1行だけ変更しました:

<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 に答える
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)

次に、新しいテンプレートを定義します (1 つのブロックのみを上書きする必要があることに注意してください)。

{% 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 に答える