django表数据交替行

时间:2013-06-01 21:18:45

标签: python django django-tables2

我想构建一个显示棒球比赛统计数据的表格。我目前有一个模型设置代表一个棒球比赛。

class Baseball(models.Model):
    gametime = models.DateTimeField()
    vteam = models.CharField(max_length=255)
    vpitcher = models.CharField(max_length=255)
    hteam = models.CharField(max_length=255)
    hpitcher = models.CharField(max_length=255)

还有其他领域,但这足以解释我正在尝试做的事情。

我正在使用django-tables2来渲染我的表格。我定义了一个Table类

class BaseballTable(tables.Table):
    class Meta:
        model = models.Baseball

我的观点

class Home(SingleTableView):
    model = models.Baseball
    table_class = tables.BaseballTable

但默认行为不是我想要的。这些表在我的数据库中每个条目显示一行。

gametime     vteam     vpitcher     hteam     hpitcher
date1        vteam1    vpitcher1    hteam1    hpitcher1
date2        vteam2    vpitcher2    hteam2    hpitcher2

相反,我希望表的行不直接模仿数据库模型,而是按如下方式交替行,以便第1行和第3行从同一位置拉出,但第2行和第4行不同。

gametime     team     pitcher
date1        vteam1   vpitcher1
<blank>      hteam1   hpitcher1
date2        vteam2   vpitcher2
<blank>      hteam2   hpitcher2

有没有人知道django-tables2是否可以这样做,或者我是否需要编写自己的表?

1 个答案:

答案 0 :(得分:1)

我相信你有一个合理的问题。

首先,我重新命名使用普通的Table而不是ModelTable,因为毕竟你需要覆盖所有的列。

行中不同类型的数据不是django-tables2支持开箱即用的东西,因此文档没有说明任何内容。但是,您可以使用许多方法来实现您想要的效果。

一种方法是安排传递给表的数据,使得一行包含date1 - vteam1 - vpitcher1,下一行将包含空白 - hteam1 - hpitcher1。为此,您将创建一个包含表数据的新列表,并将原始查询数据中的记录放入其中。如果你允许这个解决方案,你必须非常小心分类。

另一种更简单的方法是创建查询,以便它们返回date1,vteam&lt; br /&gt; hteam1,vpitcher1&lt; br /&gt; hpicher1。因此,当你渲染它时,你将获得不同行中的vteam1和hteam1!因为我现在无法测试它,如果这似乎不起作用那么可能&lt; br&gt;是不安全的,所以你应该输出mark_safe中包含的值。

要做到这一点,只需覆盖你的团队和投手的render_row并返回mark_safe(value)(或者创建一个新的类TwoRowsColumn,它将打印你的值但你喜欢 - 你甚至可以创建一个包含两行的小html表hteam和vteam将打印在单元格中用于hteam / vteam)。这里排序更容易,但你无法使用hteam或hpitcher进行排序。

还有其他方法 - 例如继承ModelTable来做你想做的事情,但我不推荐它,因为你的要求非常具体,不容易在其他任何地方重复使用。