Odoo 11 开发者菜单中的 "Fields view get" 选项是什么?

What is the "Fields view get" option in the Odoo 11 developer menu?

我正在尝试使用开发人员模式和可以使用错误符号打开的菜单来调试模块。有一个菜单项 "Edit form view" 如果您想查看表单的源代码,它非常方便。还有菜单项 "Fields view get",它以稍微不同的方式显示相同的表单。

我不明白多余的东西是从哪里来的。字段定义中有几个附加属性,通常有项修饰符="{...}"。

这些附加属性从何而来?

定义合作伙伴的表单中的示例代码:

字段视图获取

<form string="Partner" modifiers="{}">
<sheet modifiers="{}">
    <div class="oe_button_box" name="button_box" modifiers="{}">
        <button class="oe_stat_button o_res_partner_tip_opp" type="action" attrs="{'invisible': [('customer', '=', False)]}" name="273" icon="fa-star" context="{'search_default_partner_id': active_id}" modifiers="{'invisible':[['customer','=',false]]}" options="{}">
            <field string="Verkaufschancen" name="opportunity_count" widget="statinfo" modifiers="{'readonly':true}"/>
        </button>

编辑表单视图

<form string="Partners">
            <sheet>
                <div class="oe_button_box" name="button_box">
                    <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
                        <field name="active" widget="boolean_button" options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
                    </button>

关于字段 view_get

Odoo 的每个模型都有一个可以覆盖的 fields_view_get 方法。一旦视图的 XML 代码被加载并且在呈现到 HTML 之前执行此方法。这意味着您可以在视图中进行一些动态修改。在Odoo模块中查找def fields_view_get,你会发现很多情况。一个例子:

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
                    submenu=False):
    result = super(AccountMoveLine, self).fields_view_get(view_id,
                                                          view_type,
                                                          toolbar=toolbar,
                                                          submenu=submenu)

    doc = etree.XML(result['arch'])
    if view_type == 'tree' and self._module == 'account_payment_order':
        if not doc.xpath("//field[@name='balance']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'balance',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addprevious(elem)
        if not doc.xpath("//field[@name='amount_residual_currency']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'amount_residual_currency',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addnext(elem)
        if not doc.xpath("//field[@name='amount_residual']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'amount_residual',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addnext(elem)
        # Remove credit and debit data - which is irrelevant in this case
        for elem in doc.xpath("//field[@name='debit']"):
            doc.remove(elem)
        for elem in doc.xpath("//field[@name='credit']"):
            doc.remove(elem)
        result['arch'] = etree.tostring(doc)
    return result

关于修饰符

修饰符旨在替换 attrs 和其他属性(readonlyrequiredinvisible)。目前,它们与这些属性并存。引入它们的原因是为了简化新 Web 客户端的操作,使其只能查看一个地方。 modifiers 的评估也将发生在服务器端,放弃对 python (类似)解释器客户端的需要。最后,修饰符的具体语法将是 json(信息取自 https://answers.launchpad.net/openobject-server/+question/168924)。

结论

总而言之,在回答您的问题时,您在 编辑表单视图 中看到的是视图的纯 XML 代码,与您在 XML Odoo 模块的文件,而 Fields view get 是加载和转换后在客户端呈现的代码。