django-tables2 sorting non-queryset data

495 views Asked by At

Hi I have a table thus:

class MyTable(tables.Table):

    brand = tables.Column(verbose_name='Brand')
    market = tables.Column(verbose_name='Market')
    date = tables.DateColumn(format='d/m/Y')
    value = tables.Column(verbose_name='Value')

I'm populating the table with a list of dicts and then I'm configuring it and rendering it in my view in the usual django-tables2 way:

data = [
    {'brand': 'Nike', 'market': 'UK', 'date': <datetime obj>, 'value': 100},
    {'brand': 'Django', 'market': 'FR', 'date': <datetime obj>, 'value': 100},    
]

table = MyTable(data)

RequestConfig(request, paginate=False).configure(table)

context = {'table': table}

return render(request, 'my_tmp.html', context)

This all renders the table nicely with the correct data in it. However, I can sort by the date column and the value column on the webpage, but not by the brand and market. So it seems non-string values can be sorted but strings can't. I've been trying to figure out how to do this sorting, is it possible with non-queryset data?

I can't populate the table with a queryset, as I'm using custom methods to generate the value column data. Any help appreciated! I guess I need to specify the order_by parameter in my tables.Column but haven't found the correct setting yet.

1

There are 1 answers

9
Treehee On

data.sort(key = lambda item: item["brand"].lower()) will sort the list in place (so it will return None; the original 'data' list is edited) based on brand (alphabetically). The same can be done for any key.

Alternatively, sorted(data, key = lambda item: item["brand"].lower()) returns a sorted copy of the list.