如何在Odoo 9的表单视图中使用条件?

时间:2018-02-06 09:50:32

标签: xml odoo odoo-9 odoo-view

我想做这样的事情: -

<record id="view_form" model="ir.ui.view">
    <field name="name">module.form</field>
    <field name="model">module.form</field>
    <field name="inherit_id" ref="another_module.view_form"/>
    <field name="priority" eval="20"/>
    <field name="arch" type="xml">
        <xpath expr="//notebook" position="replace">
            <notebook t-if="context.get('no_error', False)">
                <page name="A" string="A">
                    <group>
                        <field name='save'/>
                    </group>
                </page>
            </notebook>
            <notebook t-if="not context.get('no_error', False)">
                <page name="A" string="A">
                    <group>
                        <field name='save' widget="my_widget"/>
                    </group>
                </page>
            </notebook>
        </xpath>
    </field>
</record>

但是我在UI / View中获得了两个笔记本

我尝试使用t-esc打印该值但是我没有得到任何值。

可以做这样的事情,还是我们可以在xpath中使用上下文?

1 个答案:

答案 0 :(得分:1)

您无法在普通表单视图中使用qweb。这是模板和报告

方法0

但是你可以创建一个辅助字段,它可能是一个计算字段,例如

aux = fields.Char(
    string='Aux',
    compute='_compute_sale_order'
)

@api.multi
@api.depends('some_field')
def _compute_aux(self):
    self.aux = 'no_error'
    # or self.env.context.get('no_error', False)

XML视图应该是:

<record id="view_form" model="ir.ui.view">
    <field name="name">module.form</field>
    <field name="model">module.form</field>
    <field name="inherit_id" ref="another_module.view_form"/>
    <field name="arch" type="xml">
        <field name="name" position="before"> <!-- or some other field -->
            <field name="aux" invisible="1" />
        </field>

        <notebook position="inside">
            <page name="A" string="A" attrs="{'invisible': [('aux', '=', 'no_error')]}">
                <group>
                    <field name="save" widget="my_widget"/>
                </group>
            </page>
        </notebook>
    </field>
</record>

请注意,您无法在同一表单中使用同一项目两次。因此,如果您想要显示<field name='save'/><field name='save' widget="my_widget"/>,则应为每个人创建一个独立的表单视图。

方法1

或者您可以尝试使用应在模型中定义的方法fields_view_get修改视图,类似这样(我还没有测试):

def fields_view_get(self, cr, uid, view_id=None, view_type='form',
                    context=None, toolbar=False, submenu=False):
    res = super(ModelName, self).fields_view_get(
        cr, uid, view_id=view_id, view_type=view_type, context=context,
        toolbar=toolbar, submenu=submenu)
    if view_type == 'form':
        eview = etree.fromstring(res['arch'])
        no_error = context.get('no_error', False)

        if eview.attrib.get('name', '') == 'save' and no_error != False:
            eview.set('widget','my_widget')

        res['arch'] = etree.tostring(eview)
    return res