我试图用django-tables2来创建一个允许用户按所有列排序,搜索和过滤的排行榜表。我没有做任何特别的事情,只是按照django-tables2的文档。
以下是模型中的样子:
class LeaderboardTable(tables.Table):
rank = tables.TemplateColumn('{{ record.rank }}')
name = tables.TemplateColumn('{{ record.user__first_name }} {{ record.user__last_name }}')
team = tables.TemplateColumn('{{ record.team }}')
points = tables.TemplateColumn('{{ record.points }}')
以下是视图中的内容:
def get_leaderboard(request):
table = LeaderboardTable(Profiles.objects.select_related().all())
RequestConfig(request).configure(table)
return render(request, 'leaderboard.html', {'table': table})
如果你查看上面的代码,你可能会注意到name列不正确,因为如果我合并到查询集中的字段,我还没想出如何排序 - 如果你也可以回答这个问题那么太棒了。
我喜欢django-tables2处理表和分页的创建;但是,每次我点击sort / next或prev页面都会导致页面刷新。有没有办法压制这个?此外,我不知道它是否因为我正在返回10,000条记录,但django-tables2在排序和分页方面似乎相当慢。
我是否使用了正确的应用程序?你们觉得我应该用别的吗?
答案 0 :(得分:1)
django-tables2 不支持支持使用JavaScript进行排序/分页而不刷新页面(目前)。
返回10k记录不应该是一个问题。我建议您使用类似django-debug-toolbar的内容来查看哪些查询执行缓慢(例如,您的select_related()
调用可能无效)。
您可以将表重写为:
class LeaderboardTable(tables.Table):
rank = tables.Column()
name = tables.Column(order_by=("first_name", "last_name"))
team = tables.Column()
points = tables.Column()
def render_name(self, record):
return u"%s %s" % (record.user.first_name, record.user.last_name)
检查使用render_name
是否可以解决您的性能问题。它应该比使用TemplateColumn
更快,但只有在表格的每个页面中渲染大量行时,这才应该很重要。
答案 1 :(得分:0)
对于要放入表格的这些项目数量以及能够在不刷新整个页面的情况下对表格进行排序,我建议您使用SlickGrid这是一个以json数据作为输入的javascript库。< / p>
将您的查询集转储到json var中并将其传递给您的模板。