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-tables2
和 django-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
被忽略了。它被称为吗?如果我尝试重建您的示例(剥离过滤内容,我会收到错误,但正在调用该方法。
我在一个带有 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-tables2
和 django-filter
时,我应该在哪里覆盖一个字段的自定义排序?
将您 link 的文档引用到:
Adding a
Table.order_FOO
method (whereFOO
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
被忽略了。它被称为吗?如果我尝试重建您的示例(剥离过滤内容,我会收到错误,但正在调用该方法。