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'