【问题标题】:How to retrieve data from models in table with a month days as table heads?如何从表中以一个月天为表头的模型中检索数据?
【发布时间】:2020-01-16 09:07:29
【问题描述】:

我是 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)

我不知道这是否是在视图函数中检索数据的最佳 Python 方式。

这是我的

模板

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

目前这是我在浏览器中得到的

我想实现类似于

任何建议或代码重组以实现预期目标都很好,谢谢。

【问题讨论】:

    标签: django python-3.x


    【解决方案1】:

    好吧,您需要将所有信息存储在一个列表中。例如:

    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 %}
    

    【讨论】:

    • 谢谢你,但我的观点仍有困难
    • 嘿 Rudra,对我的 views.py 中更好的逻辑有什么进一步的帮助吗?谢谢
    【解决方案2】:

    试试

    <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]

    【讨论】:

    • 好的。但首先告诉我你需要做什么?只显示状态?或者你需要 make 选项来编辑状态?
    • 老师的出勤是通过在给定日期出席、缺席或迟到的点名提交的,所以现在我想显示每个老师在特定日期的状态,但月份应该是表头,所以我只需要检查老师出勤的日期是否等于表头中的日期,然后显示当天的状态,再次感谢您的帮助。
    • 您给我的解决方案面临的问题是,如果老师出勤超过一个,则表中返回的状态是overlooking并给出该数字的溢出表月中的天数。我该如何解决这个问题,如何最好地调整视图中的逻辑。谢谢
    • 好的。让我们这样做。我无法通过重写您的代码来解决您的问题,因为它的代码非常脏。请不要冒犯。我可以为您从头开始编写新视图,但这需要时间。为此,请告诉您从模板传递的日期格式。你会得到什么grab_data_passed = request.POST.get('group_by')
    猜你喜欢
    • 2015-04-07
    • 2017-04-12
    • 2017-05-11
    • 2020-05-20
    • 2020-12-14
    • 2017-05-28
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多