2016-06-08 1 views
1

Я пытаюсь добавить счетчик в первый столбец таблицы, используя django-tables2, но нижеприведенное решение показывает только 0 из столбца #. Как добавить столбец, который будет содержать столбец, который будет содержать строки?Как добавить столбец счетчика в django-tables2?

tables.py:

import django_tables2 as tables 
from profiles.models import Track 
import itertools 
counter = itertools.count() 

class PlaylistTable(tables.Table): 

    priority = tables.Column(verbose_name="#", default=next(counter)) 

    class Meta: 
     model = Track 
     attrs = {"class": "paleblue"} 
     orderable = False 
     fields = ('priority', 'artist', 'title') 

Мой шаблон:

{% render_table table %} 
+0

Вы можете попробовать установить значение по умолчанию 'lambda _: next (counter)', хотя даже если бы это сработало, это было бы довольно уродливо/взломанно. – Sayse

ответ

2

Другие ответы у всех есть пример itertools.count в области верхнего уровня tables.py файл. Это заставит счетчик сохраняться между загрузками страниц, он будет сброшен только при перезапуске сервера. Лучшее решение, чтобы добавить счетчик в качестве переменной экземпляра на столе, как это:

import django_tables2 as tables 
import itertools 

class CountryTable(tables.Table): 
    counter = tables.Column(empty_values=(), orderable=False) 

    def render_counter(self): 
     self.row_counter = getattr(self, 'row_counter', itertools.count()) 
     return next(self.row_counter) 

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

2

Из документации Column

default (str or callable):

Значение по умолчанию для столбца. Это может быть значение или вызываемый объект [1]. Если объект в данных содержит None для столбца, вместо него будет использоваться значение по умолчанию.

[1] - The provided callable object must not expect to receive any arguments.

Что вы передаете next(counter) вы передаете результат функции, которая, кажется, быть целым числом.

Вы можете определить функцию:

def next_count(): 
    return next(counter) 

и использовать его по умолчанию:

priority = tables.Column(verbose_name="#", default=next_count) 

Или, вы можете использовать функцию лямбда, как упомянуто в @ Sayse Замечаний:

priority = tables.Column(verbose_name="#", default=lambda: next(counter)) 
+0

Утомляйтесь лямбда, хотя, django пытается остановить вас, устанавливая модельные значения по умолчанию для lambdas (вроде, чтобы остановить подобное). Я не уверен, насколько хорошо это будет поддерживать асинхронные запросы. – Sayse

+0

В этом случае был бы полезен первый подход с функцией. :) – AKS

+0

Да, это было бы лучше как вызываемый, но проблема остается в том, что счетчик глобальный, даже если вы должны были сделать таблицу дважды, счетчик будет начинаться с того места, где последний будет завершен, а не 1 снова :) – Sayse