我想构建一个显示棒球比赛统计数据的表格。我目前有一个模型设置代表一个棒球比赛。
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是否可以这样做,或者我是否需要编写自己的表?
答案 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来做你想做的事情,但我不推荐它,因为你的要求非常具体,不容易在其他任何地方重复使用。