2016-06-08 8 views
1

Ich versuche, einen Zähler in der ersten Spalte einer Tabelle mit Django-Tabellen2 hinzufügen, aber die Lösung unten zeigt nur alle 0 unter der Spalte #. Wie sollte ich eine Spalte hinzufügen, die eine Spalte mit den Zeilen enthält?Wie fügt man die Zählerspalte in django-tables2 hinzu?

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') 

Meine Vorlage:

{% render_table table %} 
+0

Sie könnten versuchen, die Standardeinstellung auf "Lambda _: next (counter)", obwohl selbst wenn das funktionierte, wäre es ziemlich hässlich/hacky. – Sayse

Antwort

2

Andere Antworten alle haben die itertools.count Instanz im oberen Bereich der tables.py Datei. Dadurch wird der Zähler zwischen den Seitenladevorgängen beibehalten. Er wird nur zurückgesetzt, wenn der Server neu gestartet wird. Eine bessere Lösung ist es, die Zähler als Instanzvariable auf der Tabelle wie folgt hinzuzufügen:

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) 

Dies wird sicherstellen, dass der Zähler zurückgesetzt wird jedes Mal, wenn die Tabelle instanziiert wird.

2

Aus der Dokumentation von Column

default (str or callable):

Der Standardwert für die Spalte. Dies kann ein Wert oder ein aufrufbares Objekt [1] sein. Wenn ein Objekt in den Daten None für eine Spalte bereitstellt, wird stattdessen der Standardwert verwendet.

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

Was Sie next(counter) sind vorbei Sie das Ergebnis einer Funktion sind vorbei, die eine ganze Zahl zu sein scheint.

Sie entweder eine Funktion definieren:

def next_count(): 
    return next(counter) 

und verwenden Sie es als Standard:

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

Oder können Sie die Lambda-Funktion verwenden, wie erwähnt in @ Sayse Bemerkungen:

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

Sei müde von Lambda, aber Django versucht dich davon abzuhalten, Modellvorgaben auf Lambdas zu setzen (so etwas zu stoppen). Ich bin mir nicht sicher, wie gut dies asynchrone Anfragen unterstützen wird. – Sayse

+0

In diesem Fall wäre die erste Annäherung mit der Funktion nützlich. :) – AKS

+0

Ja, das wäre besser als Callable, aber das Problem bleibt, dass der Counter global ist, auch wenn du den Tisch zweimal machen würdest, würde der Counter von dort ausgehen wo der letzte statt 1 beendet ist :) – Sayse

Verwandte Themen