1

我试图用 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})

如果您查看上面的代码,您可能会注意到名称列不正确,因为我还没有想出如果我结合到查询集中的字段时如何排序 - 如果您也能回答这个问题,那就太好了。

我喜欢 django-tables2 处理表格的创建和分页;但是,每次我点击排序/下一页或上一页时,都会导致页面刷新。有没有办法抑制这种情况?另外,我不知道是不是因为我要返回 10,000 条记录,但是 django-tables2 在排序和分页方面似乎很慢。

我为此使用了正确的应用程序吗?你们认为我应该使用其他东西吗?

4

2 回答 2

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)

检查 using 是否可以render_name解决您的性能问题。它应该比 using 更快TemplateColumn,但只有在表格的每一页中呈现大量行时,这才有意义。

于 2012-06-25T21:36:34.220 回答
0

对于要放入表中的如此数量的项目并能够在不刷新整个页面的情况下对表进行排序,我建议您使用SlickGrid,它是一个将 json 数据作为输入的 javascript 库。

只需将您的查询集转储到 json var 中并将其传递给您的模板。

于 2014-05-30T16:57:23.577 回答