django-tables2 определяет разные свойства для разных строк - PullRequest
5 голосов
/ 02 марта 2012

Я хотел бы создать таблицу с django-tables2 , чтобы разные строки имели разные свойства.

По умолчанию я получаю либо

<tr class="odd">

или

<tr class="even">

Как я могу указать свой собственный класс для некоторых строк?

Аналогичным образом, если у меня есть CheckBoxColumn и я указываю некоторые данные для этого столбца, он переходит в значение :

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

Это отлично подходит для выяснения, какой флажок был установлен. Тем не менее, как я могу установить некоторые флажки, отмеченные при создании таблицы?

Мой сценарий: пользователь выбирает несколько строк из большой таблицы. Например, таблица имеет

  • оранжевый 1
  • оранжевый 2
  • яблоко 5
  • оранжевый 3
  • яблоко 4
  • огурец 7
  • Aaple 1

Пользователь выбирает aaple 5 и огурец 7 .

Тогда я бы хотел отобразить все яблоки и все огурцы, поскольку пользователь выбрал хотя бы одно яблоко и хотя бы один огурец. Это позволяет пользователю видеть другие соответствующие записи:

  • яблоко 5
  • яблоко 4
  • огурец 7

Однако я хотел бы выделить записи, фактически выбранные пользователем, с помощью css и / или путем установки флажка:

  • яблоко 5
  • яблоко 4
  • огурец 7

Ответы [ 4 ]

8 голосов
/ 13 марта 2012

Хорошо, позвольте мне опубликовать мое собственное решение.

Я скопировал стандартный шаблон 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.

5 голосов
/ 24 сентября 2015

У меня есть очень простой обходной путь для этого

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>
4 голосов
/ 14 марта 2013

Есть другой способ (тоже не очень красивый), но здесь вам не нужно определять поддельный столбец.

Сначала вы расширяете 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 %}
0 голосов
/ 02 октября 2018

Я действительно не мог получить принятый ответ, чтобы работать для этого, возможно, последняя версия 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

Я бы предпочел оставить все эти функции внутри класса, но это, казалось, лучший способ сделать это, чтобы избежать изменения чего-либо еще.

...