【问题标题】:Nested Regroups - Django嵌套重组 - Django
【发布时间】:2017-11-14 12:36:05
【问题描述】:

我有一个包含以下字段的模型:“日期”、“员工”和“计划时间”。每个员工都有不同日期的不同计划时间。

我正在尝试构建我的模板,其中员工按行列出,他们的计划工作时间在正确对应日期下的列中列出。

Something like this

到目前为止,我的模板如下所示:

{% regroup emp3 by employee_name as emp9 %}
{% for employee_name in emp9 %}
<!--Job-->
<div class="table-row table-job-column employee-row"{{employee_name.grouper}}</div>

{% for x in employee_name.list %}

<div class="table-row table-fr-column">{{x.planned_hours}}</div>

{% endfor %}
{% endfor %}

我的看法:

def DesignHubR(request):
emp3_list = Projectsummaryplannedhours.objects.values_list('displayval', 'employeename').filter(businessunit='a').filter(billinggroup__startswith='PLS - Project').filter(Q(displayval=sunday2)|Q(displayval=sunday)).annotate(plannedhours__sum=Sum('plannedhours'))
emp3 = map(lambda x: {'date': x[0], 'employee_name': x[1], 'planned_hours': x[2]}, emp3_list)
context = {'sunday': sunday, 'sunday2': sunday2, 'emp3': emp3}
return render(request,'department_hub_ple.html', context)

我对当前结构的问题是将第一个“计划时间”放在员工旁边。如果该日期没有计划的时间,我需要能够插入一个空白列。我意识到我没有包含嵌套重组,但我尝试过的一切都没有奏效。

注意:我将我的专栏日期拉到重组之外。

编辑以包含 EMP3_LIST:

[{'date': 'W/E 6/18/17', 'planned_hours': Decimal('45.00000'), 'employee_name': 'Bob'}, {'date': 'W/E 6/25/17', 'planned_hours': Decimal('45.00000'), 'employee_name': 'Bob'}, {'date': 'W/E 6/18/17', 'planned_hours': Decimal('17.00000'), 'employee_name': 'Jack'}, {'date': 'W/E 6/25/17', 'planned_hours': Decimal('13.00000'), 'employee_name': 'Jack'}, {'date': 'W/E 6/25/17', 'planned_hours': Decimal('1.00000'), 'employee_name': 'Stan'}, {'date': 'W/E 6/18/17', 'planned_hours': Decimal('27.00000'), 'employee_name': 'Albert'}, {'date': 'W/E 6/25/17', 'planned_hours': Decimal('29.00000'), 'employee_name': 'Albert'}]

编辑2:

{% regroup emp3 by employee_name as emp9 %}
{% for employee_name in emp9 %}
<!--Job-->
<div class="table-row table-job-column employee-row">
{{employee_name.grouper}}</div>
{% regroup employee_name.list by date as date_list %}
{% for x in date_list %}
{% regroup x.list by planned_hours as plan_list %}
{% for y in plan_list %}

<div class="table-row table-fr-column">{{y.grouper}}</div>

{% endfor %}{% endfor %}

【问题讨论】:

  • 您是说当员工没有计划一天的工作时间时,您希望该员工当天的单元格为空白?但现在它会忽略没有计划时间的日子,并将计划时间从未来几天转移到左边?
  • 完全正确。它现在的设置方式只是从列表的开头开始,并按员工吐出计划的时间。
  • 因此,您在employee_name.list 中发送的数据需要每天都有某种项目,即使当天没有计划的时间。假设您有一个字典列表,例如:[ {'planned_hours': 3}, {'planned_hours': 6}, {'planned_hours': 1} ]。如果在它们之间(或之前)有一天,那么你需要有 {'planned_hours': 0} 或类似的东西。你要考虑每一天,否则一切都会向左移动。那有意义吗?这是问题还是其他原因?
  • 这是有道理的,但我认为这是可以通过嵌套重组来实现的。我将我的观点添加到了 OP。不知道如何构造一个函数以将“0”值添加到列表中。
  • 感谢您的意见。我认为您的grouper 仅按员工姓名对列表项进行分组。我很想看看你的emp3_list 的例子。如果每个员工都没有与其他员工一样的所有日子,那么会有一些列不对齐。如果您在同一张桌子上没有多名员工,这将不是问题。我认为最好将你所有的日子定义为列,无论那些日子里所有员工是否都有planned_hours

标签: python django


【解决方案1】:

您是否尝试过重新组合?您还尝试过基于类的视图吗?它们对于快速代码生成非常有用。类似于以下内容。

观点:

Class EmployeeTimeSheetView(ListView):
    model = Projectsummaryplannedhours
    template_name = "department_hub_ple.html"

    def get_queryset(self): 
       return Projectsummaryplannedhours.objects.all().order_by('-date')

模板:

{% regroup object_list by date|date:"m/d/Y" as date_list %}
    {% for date in date_list %}
     ###html code {{ date.grouper }}
    {% regroup date.list by employee as employee_list %}
        {% for employee in employee_list %}
            ###html code {{ employee.grouper }}
        {% endfor %}
     {% endfor %}

这应该允许您构建一个以日期作为列标题的表格,然后在下面按顺序列出员工及其计划工作时间。可能需要稍作调整才能显示您想要的信息,而这可能只是归结为您重新组合的字段。

我使用这种重组来按月然后按周对相关项目进行分组。

【讨论】:

  • 感谢您的回复。当你在 IRC 聊天中回复时,我是 AFK。我尝试了嵌套重组,但使用我在“编辑 2”中实现的代码得到了相同的结果。一个问题是我的“日期”实际上是一个字符串,而不是日期。
  • 是否有理由不能将其更改为字符串上的日期字段? EDIT 将您的字符串转换为日期对象。 from datetime import datetime datetime_object = datetime.strptime('Jun 1 2005 1:33PM', '%b %d %Y %I:%M%p')
  • 好吧,我想我的意思是这并不重要。我现在正在使用约会,我也有同样的问题。当我调用 {{date.grouper}} 时,我会多次列出我的日期。
  • 我想如果我想为每个员工的每个日期设置一行,它会排成一行,但它不会在所有日期都一致。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2019-08-02
  • 2015-06-20
相关资源
最近更新 更多