django-tables2: row number ordering column not in DB

84 Views Asked by At

I am using django-tables2 to create a table, How to make the column row_number follow the sort of id and age columns?

https://github.com/jieter/django-tables2/blob/master/docs/pages/ordering.rst

import django_tables2 as tables
import itertools

class SimpleTable(tables.Table):
    row_number = tables.Column(empty_values=())
    id = tables.Column()
    age = tables.Column()   

def render_row_number(self):
    self.row_number = getattr(
        self, 'row_number',  itertools.count(self.page.start_index()))
    return next(self.row_number)


def render_id(self, value):
    return f"<{value}"

I think the best way is if statement

if asc = itertools.count(self.page.start_index())

row_number id age
1 id.1 age
2 id.2 age
3 id.3 age

else desc = itertools.count(self.page.end_index(), -1)

row_number id age
3 id.3 age
2 id.2 age
1 id.1 age

but i don't know how to implant that.

-- Updated --

This code works, and it sort id column only, But not column row number!

def order_row_number(self, queryset, is_descending):
        queryset = queryset.annotate(
            length=Length('id')
        ).order_by(("-" if is_descending else "") + "length")
        return (queryset, True)

But if try to render row number

def render_row_number(self):
        self.row_number = getattr(
            self, 'row_number',  itertools.count(self.page.start_index())
        )
        return next(self.row_number)

def order_row_number(self, queryset, is_descending):
        queryset = queryset.annotate(
            length=Length('id')
        ).order_by((
            itertools.count(self.page.end_index(), -1) if is_descending else 
            itertools.count(self.page.start_index())) + "length")
        return (queryset, True)

show an error 'SimpleTable' object has no attribute 'page'

0

There are 0 best solutions below