1

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

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来呈现我的表格。我定义了一个表类

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

相反,我希望表的行不直接模仿数据库模型,而是按如下方式交替行,以便第一行和第三行从同一个地方拉出,但第二行和第四行不同。

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

有谁知道 django-tables2 是否可以做到这一点,或者我是否需要编写自己的表?

4

1 回答 1

1

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

首先,我建议使用普通表而不是模型表,因为毕竟您需要覆盖所有列。

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

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

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

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

还有其他方法 - 例如子类化 ModelTable 来做你想做的事,但我不推荐它,因为你的要求非常具体,不会轻易在其他地方重用。

于 2013-06-02T13:11:28.817 回答