如何将 Django 查询设置为列明智地呈现到 html 表中?

Vis*_* PM 3 python django html-table django-templates django-views

假设我的 sql 表看起来像这样..

产品表

--------------------------------
| id | Model| Manufacturer     |
--------------------------------
| 1  | ABC  | Samsung          |
| 2  | XYZ  | LG               | 
| 3  | ZYX  | Sony             |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

在 Django 视图中,我从该表中获取所有记录并将其传递给模板..

def compare(request):
    product_ids = request.GET.get('product_ids')
    products = Product.objects.filter(id__in=product_ids)
    return render(request, 'compare.html', {'products': products})
Run Code Online (Sandbox Code Playgroud)

由于 query_set 结果记录一个接一个地出现,我们可以说它是按行进行的,但是对于模板中的这种情况,我想创建一个 html 表,结果应该是这样的..

--------------------------------------------
|id           | 1       | 2        | 3     |
|Model        | ABC     | XYZ      | ZYX   |
|Manufacturer | Samsung | LG       | Sony  |
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

通过查看上面的示例,您可以看到数据是按列呈现的。

所以请在 Django 中给我建议一个更好的方法,我可以通过它来实现这一点,如果我是 Django 的初学者,如果我错了,请纠正我。

提前致谢

Sat*_*dra 5

使用values_list()并将您的查询集转换为列表

products = list(Product.objects.filter(id__in=product_ids).values_list('id', 'Model', 'Manufacturer'))
# OUTPUT: [(1, 'ABC', 'Samsung'), (2, 'XYZ', 'LG'), (3, 'ZYX', 'Sony')]
Run Code Online (Sandbox Code Playgroud)

现在使用zip转置这个二维矩阵

t_products = list(zip(*products))
# OUTPUT: [(1, 2, 3), ('ABC', 'XYZ', 'ZYX'), ('Samsung', 'LG', 'Sony')]
Run Code Online (Sandbox Code Playgroud)

最后你可以在你的模板中循环它

<table>
  <tbody>
    {% for pl in t_products %}
    <tr>
      {% for l in pl%}
         <td>{{l}}</td>
      {% endfor %} 
    </tr>
    {% endfor %}
  </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)