Как получить данные из моделей в таблице с месяцем дней в качестве заголовков таблицы? - PullRequest
0 голосов
/ 16 января 2020

Я новичок в Django, пытаюсь извлечь данные из моделей в таблицу html. По сути, я хочу получить информацию обо всех учителях и их статусе посещаемости (настоящее, отсутствующее и позднее) за определенный месяц, который выбрал пользователь. Умею передавать контекст в шаблон из представлений вот мой код

models.py

class TeacherAttendance(models.Model):
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE, blank=False, null=True)
date = models.DateField()
status = models.CharField(max_length=50, choices=ATTENDANCE)
objects = models.Manager()

class Meta:
    default_permissions = ('view', 'add', 'change', 'delete')
    ordering = ["date", ]
    get_latest_by = "date"

views.py

def teacher_attendance_report(request):
context = {}
form = TeacherAttendanceForm(request.POST)
if request.method == 'POST':
    if request.POST.get('group_by'):
        grab_data_passed = request.POST.get('group_by')
        get_details = TeacherAttendance.objects.filter(date__month=grab_data_passed)
        z=0
        range=9
        days=[]
        if z< range:
            dats = TeacherAttendance.objects.filter(date__month=grab_data_passed)[z].date
            z+=1
            y=dats.month
            x=dats.year
            cal = calendar.TextCalendar(calendar.WEDNESDAY)
            for day in cal.itermonthdays(x, y):
               days.append(day) 
        context['days']=days
        teacher = User.objects.filter(is_teacher=True)
        for i in teacher:
            x=i.id
            get_details = TeacherAttendance.objects.filter(teacher__user=x, date__month=grab_data_passed)
        context['get_details']=get_details  
        return render(request, 'Reports/teacher_attendance_report_details.html', context)
context={'form':form}
return render(request, 'Reports/teacher_attendance_report_index.html', context)

Я не знаю, является ли это лучшим Pythoni c способ получения данных в функции представления.

здесь мой

шаблон

 <table id="datatable-responsive"
                           class="datatable-responsive table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
                        <thead>
                         <tr>   
                        <th>Teacher <i class="fa fa-long-arrow-down" z></i> - Date <i class="fa fa-long-arrow-right"></i></th>
                            <th>{{days}}</th>
                        </tr>
                        </thead>
                        <tbody>
                        {% for details in get_details %}
                            <tr>
                                <td>{{ details.teacher }}</td>
                                <td>{{ details.status }}</td>
                            </tr>
                            {% if empty %}
                                <tr>
                                    <td colspan="9" class="text-center bg-warning">No Data</td>
                                </tr>
                            {% endif %}
                        {% endfor %}
                        </tbody>
                    </table>

В настоящее время это то, что я получаю в браузере current table

Я хочу добиться чего-то похожего на this

Любая рекомендация или реструктуризация кода для достижения желаемой цели хорошо, спасибо.

Ответы [ 2 ]

1 голос
/ 16 января 2020

Ну, вам нужно хранить всю информацию в списке. Например:

get_all_details = list()
for i in teacher:
    x=i.id
    get_all_details.append(TeacherAttendance.objects.filter(teacher__user=x, date__month=grab_data_passed))

И отобразить в шаблоне:

context['get_all_details']=get_all_details  

И обновить шаблон:

{% for get_details in get_all_details %}
    {% for details in get_details %}
       <tr>
          <td>{{ details.teacher }}</td>
          <td>{{ details.status }}</td>
       </tr>
       {% if empty %}
        <tr>
             <td colspan="9" class="text-center bg-warning">No Data</td>
        </tr>
       {% endif %}
    {% endfor %}
{% endfor %}
1 голос
/ 16 января 2020

try

<th>{% for day in days %}{{day}}{% endfor %}</th>

вместо

<th>{{days}}</th>

, после этого вам нужно отправить список учителей в контекст, чтобы увидеть что-то вроде

teacher = User.objects.filter(is_teacher=True)
context['teachers'] = teacher

, а затем в ваша html попытка

<tbody>
   {% for teacher in teachers %}
     <tr>
       <td>{{ teacher }}</td>
       {% for details in get_details %}
       {% for day in days %}
         {% if detail.teacher == teacher and detail.date|date:'d' == day %}<td>{{ detail.status }}</td>{% else %}<td>--</td>{% endif %}
       {%endfor%}
       {%endfor%}
      </tr>
</tbody>

одна вещь, которую вы должны изменить, это то, что вам нужно для этого другого формата списка дней, это должно быть [01,02,03,04, .. 10, .. 20,. 30]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...