django-tables2 中 table 的自定义排序

custom sorting for table in django-tables2

我在一个带有 django-filter 的站点上有一个带有 django-tables2 的 table。我使用的 PagedFilteredTableView 看起来像这样:

class PagedFilteredTableView(SingleTableView):
    filter_class = None
    formhelper_class = None
    context_filter_name = 'filter'

    def get_queryset(self, **kwargs):
        qs = super(PagedFilteredTableView, self).get_queryset()
        self.filter = self.filter_class(self.request.GET, queryset=qs)
        self.filter.form.helper = self.formhelper_class()
        return self.filter.qs

    def get_context_data(self, **kwargs):
        context = super(PagedFilteredTableView, self).get_context_data()
        context[self.context_filter_name] = self.filter
        return context

这是视图:

def sorted_str_number(str):
    return int(str)


class PageList(PagedFilteredTableView):

    model = Page
    table_class = PageTable
    filter_class = PageListFilter
    formhelper_class = PageListFormHelper

    pagination = {
        '20': 20,
        '50': 50,
        '100': 100,
    }

    def get_table_class(self):
        klass = super().get_table_class()
        if 'pagination' in self.request.GET:
            klass._meta.per_page = int(self.request.GET['pagination'])
        return klass

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['per_page_table'] = sorted(self.pagination.keys(), key=sorted_str_number)
        return context

我需要像这样在 tables.py 中实现 natural sort for one column. I thought I could override order 行为:

class PageTable(Table):
    column_name = Column(verbose_name='ID')

    def order_column_name(self, queryset, is_descending):  
        return sorted(queryset, key=lambda q: natural_sort_key(q.column_name)), True

但是order_column_name方法被忽略了。使用 django-tables2django-filter 时,我应该在哪里覆盖一个字段的自定义排序?

将您 link 的文档引用到:

Adding a Table.order_FOO method (where FOO is the name of the column), gives you the ability to chain to, or modify, the original queryset when that column is selected to be ordered.

您所做的是对 python 中的查询集进行排序,如果您先将查询集转换为列表,这可能会奏效,但看起来您现在混合太多了。

也就是说,你说 order_column_name 被忽略了。它被称为吗?如果我尝试重建您的示例(剥离过滤内容,我会收到错误,但正在调用该方法。