我可以在 django-tables2 中制作二维 table 吗?
can i make a two dimensional table in django-tables2?
已编辑:
大家好,几天来我一直在寻找解决问题的方法,但没有答案
我正在尝试使用从同一模型获得的数据制作二维 table。
这个想法是在行中列出学生,在列中列出数据以及在各自的单元格中列出状态,二维 table.
class DailyAttendanceStudent(models.Model):
ATTENDANCE_CHOICES = (
(None,''),
(True,'Presente'),
(False, 'Ausente')
)
date = models.DateField(default=datetime.datetime.now)
status = models.NullBooleanField(choices=ATTENDANCE_CHOICES)
student = models.ForeignKey('perfiles.Student')
这些是我的 table:
class StudentAttendanceTable(tables.Table):
nombres = tables.Column('nombres', accessor='Student.first_name')
apellidos = tables.Column('apellidos', accessor='Student.last_name')
date = tables.Column('fecha', accessor='date')#LinkColumn
status = tables.Column('status', accessor='status')
class Meta:
model = DailyAttendanceStudent
fields = ('nombres', 'apellidos', 'date', 'status')
图形上这就是我想要做的:
我想我会这样做:
- 根据需要过滤
DailyAttendanceStudent
查询集,并将其传递给您的 table。
- 为您的 table 实现自定义构造函数,执行如下操作:
- 循环查询集,将其转换为 OrderedDict 并以用户 ID 为键。对于任何新日期,您应该向实例添加一个新列,并将该日期的键添加到 OrderedDict。
- 新专栏可以是
table.Column
,也可以是专门满足您需要的专栏。
- 自定义构造函数应该调用父 class 的构造函数,将 OrderedDict 的项目作为数据传递,将日期列作为
extra_columns
。
在代码中,它可能如下所示:
from collections import OrderedDict
import django_tables2 as tables
class StudentAttendanceTable(tables.Table):
nombres = tables.Column('nombres', accessor='student.first_name')
apellidos = tables.Column('apellidos', accessor='student.last_name')
def __init__(self, data, *args, **kwargs):
rows = OrderedDict()
extra_columns = {}
for row in data:
if row.student.id not in rows:
rows[row.student.id] = {'student': row.student}
rows[row.student.id][row.date] = row.status
extra_columns[row.date.isoformat()] = tables.Column() # use more specialized column if you get this to work
super(StudentAttendanceTable, self).__init__(data=rows.values(), extra_columns=extra_columns.items(), *args, **kwargs)
您可能希望对传递给 extra_columns
的值进行排序,因为从数据库中检索到的顺序可能不是显示所需的顺序。
已编辑: 大家好,几天来我一直在寻找解决问题的方法,但没有答案 我正在尝试使用从同一模型获得的数据制作二维 table。 这个想法是在行中列出学生,在列中列出数据以及在各自的单元格中列出状态,二维 table.
class DailyAttendanceStudent(models.Model):
ATTENDANCE_CHOICES = (
(None,''),
(True,'Presente'),
(False, 'Ausente')
)
date = models.DateField(default=datetime.datetime.now)
status = models.NullBooleanField(choices=ATTENDANCE_CHOICES)
student = models.ForeignKey('perfiles.Student')
这些是我的 table:
class StudentAttendanceTable(tables.Table):
nombres = tables.Column('nombres', accessor='Student.first_name')
apellidos = tables.Column('apellidos', accessor='Student.last_name')
date = tables.Column('fecha', accessor='date')#LinkColumn
status = tables.Column('status', accessor='status')
class Meta:
model = DailyAttendanceStudent
fields = ('nombres', 'apellidos', 'date', 'status')
图形上这就是我想要做的:
我想我会这样做:
- 根据需要过滤
DailyAttendanceStudent
查询集,并将其传递给您的 table。 - 为您的 table 实现自定义构造函数,执行如下操作:
- 循环查询集,将其转换为 OrderedDict 并以用户 ID 为键。对于任何新日期,您应该向实例添加一个新列,并将该日期的键添加到 OrderedDict。
- 新专栏可以是
table.Column
,也可以是专门满足您需要的专栏。 - 自定义构造函数应该调用父 class 的构造函数,将 OrderedDict 的项目作为数据传递,将日期列作为
extra_columns
。
在代码中,它可能如下所示:
from collections import OrderedDict
import django_tables2 as tables
class StudentAttendanceTable(tables.Table):
nombres = tables.Column('nombres', accessor='student.first_name')
apellidos = tables.Column('apellidos', accessor='student.last_name')
def __init__(self, data, *args, **kwargs):
rows = OrderedDict()
extra_columns = {}
for row in data:
if row.student.id not in rows:
rows[row.student.id] = {'student': row.student}
rows[row.student.id][row.date] = row.status
extra_columns[row.date.isoformat()] = tables.Column() # use more specialized column if you get this to work
super(StudentAttendanceTable, self).__init__(data=rows.values(), extra_columns=extra_columns.items(), *args, **kwargs)
您可能希望对传递给 extra_columns
的值进行排序,因为从数据库中检索到的顺序可能不是显示所需的顺序。