я могу сделать двумерную таблицу в django-tables2? - PullRequest
0 голосов
/ 19 мая 2018

Отредактировано: Привет, ребята, я искал решение своей проблемы в течение нескольких дней без ответа. Я пытаюсь создать двумерную таблицу с данными, полученными из той же модели.Идея состоит в том, чтобы перечислить студентов в строках, данные в столбцах и статус в соответствующих ячейках, двухмерную таблицу.

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')

Это моя таблица:

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')

Графически это то, что я хочу сделать:

I want to do this

1 Ответ

0 голосов
/ 22 мая 2018

Думаю, я бы сделал что-то вроде этого:

  • Отфильтруйте набор запросов DailyAttendanceStudent, как вам нужно, и передайте его в вашу таблицу.
  • Реализуйте пользовательский конструктор для вашей таблицы, делая что-то вроде этого:
    • Цикл по набору запросов, преобразовывая его в OrderedDict с идентификатором пользователя в качестве ключа.Для любой новой даты вы должны добавить новый столбец в экземпляр и добавить ключ для этой даты в OrderedDict.
    • Новый столбец может быть table.Column, или что-то специализированное в соответствии с вашими потребностями.
    • Пользовательский конструктор должен вызывать конструктор родительского класса, передавая элементы OrderedDict как данные, а столбцы даты - как extra_columns.

Inкод, это может выглядеть так:

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, так как заказ, извлеченный из базы данных, может не соответствовать желаемому заказу для представления.

...