Odoo 16.0表单视图如何根据记录值条件显示数据?
解决Odoo 16表单视图中record/name未定义的问题
问题原因
Odoo表单视图的QWeb模板默认上下文里没有record或直接的字段名变量,直接引用会导致未定义错误。正确访问当前记录的方式是通过widget.record对象。
解决方案1:使用QWeb的widget.record变量
修改t-if条件,通过widget.record访问当前记录的字段:
<record id="custom.model_view_form" model="ir.ui.view"> <field name="name">custom.model.view.form</field> <field name="model">custom.model</field> <field name="arch" type="xml"> <form string="Model"> <sheet> <field name="name" /> <!-- 判断记录是否存在id --> <t t-if="widget.record.id"> <h1>Hello world!</h1> <button string="Test Button" name="action_test" type="object" class="oe_highlight"/> </t> <!-- 判断name字段等于'Anon' --> <t t-if="widget.record.name === 'Anon'"> <p>当前记录名称为Anon</p> </t> </sheet> </form> </field> </record>
解决方案2:使用Odoo标准attrs属性(推荐简单场景)
如果只是控制元素显示/隐藏,用attrs属性结合域表达式更符合Odoo规范,无需编写QWeb逻辑:
<record id="custom.model_view_form" model="ir.ui.view"> <field name="name">custom.model.view.form</field> <field name="model">custom.model</field> <field name="arch" type="xml"> <form string="Model"> <sheet> <field name="name" /> <!-- 当id存在时显示按钮 --> <button string="Test Button" name="action_test" type="object" class="oe_highlight" attrs="{'invisible': [('id', '=', False)]}"/> <!-- 当name等于'Anon'时显示提示 --> <p attrs="{'invisible': [('name', '!=', 'Anon')]}">当前记录名称为Anon</p> </sheet> </form> </field> </record>
两种方案对比
- widget.record方式:适合复杂逻辑场景,比如需要动态生成HTML内容、循环渲染等。
- attrs方式:配置简洁,是Odoo官方推荐的字段级显示控制方式,适合简单的显隐需求。
内容的提问来源于stack exchange,提问作者Jhordy Said Barrera
相关产品推荐
相关产品推荐

