如何避免Odoo 15中因缺失键值导致的模板渲染错误
Odoo 15模板缺失字典键的KeyError解决思路
针对你遇到的字典缺失键导致模板渲染500错误的问题,除了补全后端返回的所有键,还有以下几种可行的前端模板层面的解决方法:
方法1:使用字典get()方法(最简洁)
直接用字典的get()方法替代键取值,该方法允许指定默认值,当键不存在时会返回默认值而非抛出KeyError。
修改模板中的取值代码:
<td><t t-esc="row.get('Brouillon', 0)"/></t> <!-- 或者需要空显示的话用空字符串 --> <td><t t-esc="row.get('Brouillon', '')"/></t>
其他缺失键的字段(比如Qualification)也可以用同样方式处理,根据业务需求设置合适的默认值(0、空字符串等)。
方法2:用t-if判断键是否存在
通过t-if检查当前行字典中是否包含目标键,存在则渲染对应值,不存在则渲染默认内容。
示例代码:
<td> <t t-if="'Brouillon' in row"> <t t-esc="row['Brouillon']"/> </t> <t t-else=""> 0 <!-- 或空内容 --> </t> </td>
注意判断条件的写法是'键名' in row,不要写错语法。
方法3:模板内统一处理行数据
如果需要处理多个缺失键的字段,可以在遍历行数据时,先统一补全所有必要键的默认值,再使用处理后的字典渲染内容,减少重复代码。
示例代码:
<t t-foreach="PRI_par_DSP_par_stage" t-as="row"> <!-- 补全所有需要的键,默认值根据业务设置 --> <t t-set="processed_row" t-value="dict( row, Brouillon=row.get('Brouillon', 0), Qualification=row.get('Qualification', 0), Closing=row.get('Closing', 0) )"/> <tr> <td><t t-esc="processed_row['dsp_id']"/></td> <td><t t-esc="processed_row['Brouillon']"/></td> <td><t t-esc="processed_row['Qualification']"/></td> <td><t t-esc="processed_row['Closing']"/></td> </tr> </t>
这种方式适合字段较多的场景,只需要处理一次,后续直接使用processed_row即可。
内容的提问来源于stack exchange,提问作者Claudiu
相关产品推荐
相关产品推荐

