2013-05-22 9 views
7

Nel mio progetto Django ho bisogno di avere tabelle le cui colonne sono dinamiche e dipendono da ciò che è nel database. Così ho trovato una soluzione in here e funziona, ma con un piccolo problema. Ecco la classe con un tavolo che sto estendendo in modo dinamico:Django-tables2 - aggiunta dinamica di colonne alla tabella - non aggiunta attrs al tag table in html

class ClientsTable(tables.Table): 
    class Meta: 
     model = Client 
     attrs = {"class": "paleblue", "orderable":"True", "width":"100%"} 
     fields = ('name',) 

    def __init__(self, *args, **kwargs): 
     super(ClientsTable, self).__init__(*args, **kwargs) 
     self.counter = itertools.count() 

    def render_row_number(self): 
     return '%d' % next(self.counter) 

    def render_id(self, value): 
     return '%s' % value 

E qui è il metodo che estende la classe:

def define_table(roles): 
    attrs = dict((r.name, tables.Column() for r in roles) 
    klass = type('DynamicTable', (ClientsTable,), attrs) 
    return klass 

Quando sto creando una tabella in views.py in questo modo:

table = define_table(roles)(queryset) 

la tabella mostra le colonne come avrei voluto, ma nel codice html vedo che ha ignorato le attrs:

{"class": "paleblue", "orderable":"True", "width":"100%"} 

Quindi non esiste uno stile css per paleblue, che è importante per me. Penso che potrebbe essere qualcosa con la classe Meta ma i campi e il modello funzionano, quindi non ho idea del perché attrs non lo sia.

risposta

6

Prima di tutto, meta options are not inherited in django-tables2. Quindi puoi controllare le soluzioni alternative discusse nel problema per vedere se qualcosa si adatta o puoi manuall aggiungere una classe Meta alla tua tabella dinamica. Per fare questo, è possibile il metodo di define_table in questo modo:

 
def define_table(roles): 
    attrs = dict((r.name, tables.Column() for r in roles) 
    attrs['Meta'] = type('Meta',(), dict(attrs={"class":"paleblue", "orderable":"True", "width":"100%"})) 
    return klass 

Ops dopo più di due anni ho notato che c'è stato un errore nel mio codice - avevo dimenticato di includere la riga klass = type('DynamicTable', (ClientsTable,), attrs) prima return klass sopra. Lo sto aggiungendo ora per completezza.

+0

Bella roba! Non ho risolto esattamente il mio problema, ma ho potuto modificare il tuo snippet per risolvere il mio problema e ho imparato molto sull'azione di tipo Python 'type' e meta class. Grazie mille! – schwobaseggl

+0

Contento di aver aiutato! Ho anche scritto vari post facendo cose di tipo sul mio blog: http://spapas.github.io/category/django.html – Serafeim

3

Per chiunque lo cerchi ora, da django-tables2 1.10 aggiungi colonne dinamicamente a un tavolo passando extra_columns al costruttore Table.

extra_columns deve essere un elenco di tuple, che definisce un nome di colonna e un oggetto Column, ad es.

class MyTable(Table): 
    static_column = Column() 

mytable = MyTable(extra_columns=[('dynamic_column', Column())] 

Vedere la documentazione API a: http://django-tables2.readthedocs.io/en/latest/pages/api-reference.html#django_tables2.tables.Table