Odoo 13中按客户名称字母序排序字典用于QWeb报表
按客户名称字母序排序订单字典的解决方案
你的代码问题出在循环里引用了未定义的key变量,且错误地对客户的产品列表排序,而非客户名称本身。以下是正确的实现方案:
基础排序:仅按客户名称字母序排列
直接对外层字典的客户名称(键)进行排序,再构建有序字典(Python 3.7+ 普通字典会保留插入顺序,满足QWeb报表的遍历需求):
reparto_data = { 'Cliente 1': { 'Pastel manzana': 12, 'Bomba crema': 8, }, 'Cliente 2': { 'Cake calabaza': 18, 'Bombon chocolate': 8, }, # 更多客户数据... } # 按客户名称字母序排序,生成新的有序字典 reparto_data_ordenado = {} for cliente in sorted(reparto_data): reparto_data_ordenado[cliente] = reparto_data[cliente] # 或者用更简洁的字典推导式 reparto_data_ordenado = {cliente: reparto_data[cliente] for cliente in sorted(reparto_data)}
进阶排序:同时对客户下的产品也按字母序排列
如果QWeb报表需要每个客户的产品也按字母序展示,可以在内层字典也做排序:
reparto_data_ordenado = {} for cliente in sorted(reparto_data): # 对当前客户的产品名称排序,生成有序的产品字典 productos_ordenados = {producto: cantidad for producto in sorted(reparto_data[cliente])} reparto_data_ordenado[cliente] = productos_ordenados
QWeb报表中使用有序字典
在QWeb模板中直接遍历有序字典即可按排序后的顺序渲染内容:
<t t-foreach="reparto_data_ordenado" t-as="cliente"> <h3>Cliente: <t t-esc="cliente"/></h3> <table> <tr> <th>Producto</th> <th>Cantidad</th> </tr> <t t-foreach="reparto_data_ordenado[cliente]" t-as="producto"> <tr> <td><t t-esc="producto"/></td> <td><t t-esc="reparto_data_ordenado[cliente][producto]"/></td> </tr> </t> </table> </t>
内容的提问来源于stack exchange,提问作者Aleredfer
相关产品推荐
相关产品推荐

