在模板中过滤以专门在django中排列数据

时间:2016-08-24 15:22:51

标签: python django python-2.7

如何在模板中使用过滤器将值放在键匹配的行中。

因此,例如,内部OD键行1中的所有值都应具有该键的值 然后在第二行中,应该具有第2行值的Outter OD键的所有值。

非常感谢任何帮助

这是我的view.py

@login_required 
def shipping(request, id): 
  sheet_data = Sheet.objects.get(pk=id) 
  work_order = sheet_data.work_order 
  customer_data = Customer.objects.get(id=sheet_data.customer_id) 
  customer_name = customer_data.customer_name 
  title_head = 'Shipping-%s' % sheet_data.work_order 
  complete_data = Sheet.objects.raw("""select s.id, d.id d_id, s.work_order, d.target, i.reading, d.description, i.serial_number from app_sheet s left join app_dimension d on s.id = d.sheet_id 
  left join app_inspection_vals i on d.id = i.dimension_id""") 

  for c_d in complete_data: 
    dim_description = Dimension.objects.filter(sheet_id=c_d.id).values_list('description', flat=True).distinct() 

    dim_id = Dimension.objects.filter(sheet_id=c_d.id)[:1] 
    for d_i in dim_id: 
      dim_data = Inspection_vals.objects.filter(dimension_id=d_i.id) 
      reading_data = Inspection_vals.objects.filter(dimension_id=d_i.id)       

  key_list = [] 
  vals_list = [] 

  for xr in complete_data: 

    key_list.append(xr.description) 
    vals_list.append(xr.reading) 

    #print reading_desc 
    sample_size = dim_data   
  res = {} 
  for i in range(len(key_list)): 
    if key_list[i] in res: 
      res[key_list[i]].append(vals_list[i]) 
    else: 
      res[key_list[i]]=[vals_list[i]] 

  reading_desc = res 

  return render(request, 'app/shipping.html', 
  { 
     'work_order': work_order, 
     'sample_size': sample_size, 
     'customer_name': customer_name, 
     'title': title_head, 
     'complete_data': complete_data, 
     'dim_description': dim_description, 
     'reading_desc': reading_desc, 
  }) 

这里是reading_desc的输出,它正确地使用了正确的键和每个值。

    {u'Inner OD': [2, None, None, 1, 1, 1, 6, 1, 2, 4, 5, 5, 7, 1, 1, 2, 3, 4, 5, 1, None, 3, 4, 6], u'Outter OD': [3, 4, 5, 1, 3, 2, 2, 2, 2, 1, 1, 1, 1, 3, 4, 3, 5, 6, 5, 2, 3]} 

这是我的模板shipping.html

<div class="container"> 
  <div class="row"> 
      <div> 
        <table > 
          <thead> 
          <tr> 
            <th>Serial Number</th> 
            {% for ss in sample_size %} 
               <th>{{ ss.serial_number }}</th> 
            {% endfor %} 
          </tr> 
          </thead> 
          <tbody> 
             {% for desc in dim_description.all %} 
             <tr> 
                <th> {{ desc }}</th> 
                {% for r_c in reading_desc %} 
                  <td class="{% cycle r_c, r_c %}"> {{ r_c }} </td> 
                {% endfor %}                 
             {% endfor %} 
             </tr> 
          </tbody> 
        </table> 
     </div>       
  </div> 
</div> 

这就是我想要的样子

Filter

1 个答案:

答案 0 :(得分:1)

好的,我们走了。这是你使用Django在html页面中循环字典的方法:

<tbody> 
    <tr> 
    {% for desc in dim_description.all %} 
        <th> {{ desc }}</th>  
    {% endfor %} 
    </tr>
    {% for key, values in reading_desc.items %} 
    <tr>
        <td class="some_class_here"> {{ key }} </td> 
        {% for v in values %}
        <td class="some_class_here">{{ v }}</td>
        {% endfor %}
    <tr>
    {% endfor %}                 
</tbody> 

这应该足以让你前进。这里发生了一些事情。首先,在迭代dim_description列表的第一个循环中,我们添加一个带有多个<th>标记的行来显示标题(在您的情况下为1-24)。然后在第二个循环中,我们循环遍历字典。我们首先显示键(第一次迭代的内部OD),然后我们必须遍历每个键的所有值(页面中第二个for循环的内部for循环),它应该显示你想要的。这可能不是完整的答案,但它应该足以解决您的问题。