Odoo中文社区可以通过以下三个域名访问:shine-it.net , odoocn.org,odoo.net.cn

原论坛用户的基本信息和发帖这里都予以保留,请注意:原论坛用户无需重新注册新用户,但是您的密码需要重置

开发人员可以登录gitter讨论组: http://gitter.im/odoo-china/Talk, 需要github账号

如果您登录系统碰到问题,请在微信公众号留言:

如何在继承的视图中有重复的field name的字段后添加新字段的方法



  • 该问题是校长在给我们公司财务经理写的一个模块中出现的,目的是在供应商的“销售&采购“Tab页下面的供应商后面添加一字段,显示该供应商可供产品的类型。<br /><br />下面是校长的代码:<br />partner.py<br />[code]<br /># coding: utf-8<br />from osv import orm, fields<br /><br />class Partner(orm.Model):<br />    _inherit = 'res.partner'<br /><br />    _columns = {<br />            'product_categ_id': fields.many2one('product.category',<br />                u'供货类型'),<br />            }<br /><br />[/code]<br />partner_view.xml:<br />[code]<br /><openerp><br />    <data><br />        <record id="res_partner_view_supplier_product_categ" model="ir.ui.view"><br />            <field name="name">res.partner.view.supplier.product_categ</field><br />            <field name="model">res.partner</field><br />            <field name="inherit_id" ref="base.view_partner_form" /><br />            <field name="priority" eval="20"/><br />            <field name="arch" type="xml"><br />                <xpath expr="//field[@name='supplier']" position="after"><br />                  <field name="product_categ_id"<br />                    attrs="{'invisible': [('supplier', '=', False)]}"/><br />                </xpath><br />            </field><br />        </record><br />      </data><br /></openerp><br />[/code]<br /><br />问题来了,页面并没有如预期中的那样在‘供应商’后显示‘供货类型’。<br />我之前喜欢采用<field name="xxx" position='after'>的方式定位字段,自己尝试一下同样行不通。后来我把字段放在了“customer"后面,却能够正常的显示。。。<br /><br />找res.partner模块的源码,发现问题:<br />res_partner_view.xml<br />[code]<br /> <form string="Contact" version="7.0"><br />                                    <sheet><br />                                        <field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/><br />                                        <div class="oe_title"><br />                                            <label for="name" class="oe_edit_only"/><br />                                            <h1><field name="name" style="width: 70%%"/></h1><br />                                            <field name="category_id" widget="many2many_tags" placeholder="Tags..." style="width: 70%%"/><br />                                        </div><br />                                        <group><br />                                            <field name="function" placeholder="e.g. Sales Director"/><br />                                            <field name="email"/><br />                                            <field name="phone"/><br />                                            <field name="mobile"/><br />                                        </group><br />                                        <div><br />                                            <field name="use_parent_address"/><label for="use_parent_address"/><br />                                        </div><br />                                        <group><br />                                            <label for="type"/><br />                                            <div name="div_type"><br />                                                <field class="oe_inline" name="type"/><br />                                            </div><br />                                            <label for="street" string="Address" attrs="{'invisible': [('use_parent_address','=', True)]}"/><br />                                            <div attrs="{'invisible': [('use_parent_address','=', True)]}" name="div_address"><br />                                                <field name="street" placeholder="Street..."/><br />                                                <field name="street2"/><br />                                                <div class="address_format"><br />                                                    <field name="city" placeholder="City" style="width: 40%%"/><br />                                                    <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/><br />                                                    <field name="zip" placeholder="ZIP" style="width: 20%%"/><br />                                                </div><br />                                                <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/><br />                                            </div><br />                                        </group><br />                                        <field name="supplier" invisible="True"/><-------------------------看这里<br />                                    </sheet><br />                                </form><br />.......<br /> <page string="Internal Notes"><br />                            <field name="comment" placeholder="Put an internal note..."/><br />                        </page><br />                        <page string="Sales &amp; Purchases"><br />                            <group><br />                                <group><br />                                    <field name="user_id"/><br />                                    <field name="company_id" groups="base.group_multi_company" widget="selection"/><br />                                </group><br />                                <group><br />                                    <field name="customer"/><br />                                    <field name="supplier"/><-----------------------------------再看这里<br />                                </group><br />                                <group><br />                                    <field name="ref"/><br />                                    <field name="lang"/><br />                                    <field name="date"/><br />                                </group><br />                                <group><br />                                    <field name="active"/><br />                                </group><br />                            </group><br />                        </page><br />[/code]<br />发现在res_partner_view.xml文件中居然存在两个相同name的field,看来这就为什么字段不显示的原因了,个人猜想xpath<br /> <xpath expr="//field[@name='supplier']" position="after">方式的定位只会定位第一个字段,<br />修改代码如下:<br />[code]<br /><openerp><br />    <data><br />        <record id="res_partner_view_supplier_product_categ" model="ir.ui.view"><br />            <field name="name">res.partner.view.supplier.product_categ</field><br />            <field name="model">res.partner</field><br />            <field name="inherit_id" ref="base.view_partner_form" /><br /> <field name="priority" eval="40"/><br />            <field name="arch" type="xml"><br /> <xpath expr="/form/sheet/notebook/page[@string='Sales &amp; Purchases']/group/group/field[@name='supplier']" position="after"><br />   <field name="product_categ_id" attrs="{'invisible': [('supplier', '=', False)]}"/><br /> </xpath><br />            </field><br />        </record><br />      </data><br /></openerp><br />[/code]<br /><br />刷新页面,成功。<br />看来在用xpath定位字段的时候,最好还是把路径写全比较稳妥。



  • 该问题是校长在给我们公司财务经理写的一个模块中出现的,目的是在供应商的“销售&采购“Tab页下面的供应商后面添加一字段,显示该供应商可供产品的类型。<br /><br />下面是校长的代码:<br />partner.py<br />[code]<br /># coding: utf-8<br />from osv import orm, fields<br /><br />class Partner(orm.Model):<br />    _inherit = 'res.partner'<br /><br />    _columns = {<br />            'product_categ_id': fields.many2one('product.category',<br />                u'供货类型'),<br />            }<br /><br />[/code]<br />partner_view.xml:<br />[code]<br /><openerp><br />    <data><br />        <record id="res_partner_view_supplier_product_categ" model="ir.ui.view"><br />            <field name="name">res.partner.view.supplier.product_categ</field><br />            <field name="model">res.partner</field><br />            <field name="inherit_id" ref="base.view_partner_form" /><br />            <field name="priority" eval="20"/><br />            <field name="arch" type="xml"><br />                <xpath expr="//field[@name='supplier']" position="after"><br />                  <field name="product_categ_id"<br />                    attrs="{'invisible': [('supplier', '=', False)]}"/><br />                </xpath><br />            </field><br />        </record><br />      </data><br /></openerp><br />[/code]<br /><br />问题来了,页面并没有如预期中的那样在‘供应商’后显示‘供货类型’。<br />我之前喜欢采用<field name="xxx" position='after'>的方式定位字段,自己尝试一下同样行不通。后来我把字段放在了“customer"后面,却能够正常的显示。。。<br /><br />找res.partner模块的源码,发现问题:<br />res_partner_view.xml<br />[code]<br /> <form string="Contact" version="7.0"><br />                                    <sheet><br />                                        <field name="image" widget='image' class="oe_avatar oe_left" options='{"preview_image": "image_medium"}'/><br />                                        <div class="oe_title"><br />                                            <label for="name" class="oe_edit_only"/><br />                                            <h1><field name="name" style="width: 70%%"/></h1><br />                                            <field name="category_id" widget="many2many_tags" placeholder="Tags..." style="width: 70%%"/><br />                                        </div><br />                                        <group><br />                                            <field name="function" placeholder="e.g. Sales Director"/><br />                                            <field name="email"/><br />                                            <field name="phone"/><br />                                            <field name="mobile"/><br />                                        </group><br />                                        <div><br />                                            <field name="use_parent_address"/><label for="use_parent_address"/><br />                                        </div><br />                                        <group><br />                                            <label for="type"/><br />                                            <div name="div_type"><br />                                                <field class="oe_inline" name="type"/><br />                                            </div><br />                                            <label for="street" string="Address" attrs="{'invisible': [('use_parent_address','=', True)]}"/><br />                                            <div attrs="{'invisible': [('use_parent_address','=', True)]}" name="div_address"><br />                                                <field name="street" placeholder="Street..."/><br />                                                <field name="street2"/><br />                                                <div class="address_format"><br />                                                    <field name="city" placeholder="City" style="width: 40%%"/><br />                                                    <field name="state_id" class="oe_no_button" placeholder="State" style="width: 37%%" options='{"no_open": True}' on_change="onchange_state(state_id)"/><br />                                                    <field name="zip" placeholder="ZIP" style="width: 20%%"/><br />                                                </div><br />                                                <field name="country_id" placeholder="Country" class="oe_no_button" options='{"no_open": True}'/><br />                                            </div><br />                                        </group><br />                                        <field name="supplier" invisible="True"/><-------------------------看这里<br />                                    </sheet><br />                                </form><br />.......<br /> <page string="Internal Notes"><br />                            <field name="comment" placeholder="Put an internal note..."/><br />                        </page><br />                        <page string="Sales &amp; Purchases"><br />                            <group><br />                                <group><br />                                    <field name="user_id"/><br />                                    <field name="company_id" groups="base.group_multi_company" widget="selection"/><br />                                </group><br />                                <group><br />                                    <field name="customer"/><br />                                    <field name="supplier"/><-----------------------------------再看这里<br />                                </group><br />                                <group><br />                                    <field name="ref"/><br />                                    <field name="lang"/><br />                                    <field name="date"/><br />                                </group><br />                                <group><br />                                    <field name="active"/><br />                                </group><br />                            </group><br />                        </page><br />[/code]<br />发现在res_partner_view.xml文件中居然存在两个相同name的field,看来这就为什么字段不显示的原因了,个人猜想xpath<br /> <xpath expr="//field[@name='supplier']" position="after">方式的定位只会定位第一个字段,<br />修改代码如下:<br />[code]<br /><openerp><br />    <data><br />        <record id="res_partner_view_supplier_product_categ" model="ir.ui.view"><br />            <field name="name">res.partner.view.supplier.product_categ</field><br />            <field name="model">res.partner</field><br />            <field name="inherit_id" ref="base.view_partner_form" /><br /> <field name="priority" eval="40"/><br />            <field name="arch" type="xml"><br /> <xpath expr="/form/sheet/notebook/page[@string='Sales &amp; Purchases']/group/group/field[@name='supplier']" position="after"><br />   <field name="product_categ_id" attrs="{'invisible': [('supplier', '=', False)]}"/><br /> </xpath><br />            </field><br />        </record><br />      </data><br /></openerp><br />[/code]<br /><br />刷新页面,成功。<br />看来在用xpath定位字段的时候,最好还是把路径写全比较稳妥。


  • 管理员

    @KevinKong<br />这文章写的干净漂亮,多谢帮我修了bug。 :) <br /><br />这个invisible 的 supplier不知道是哪个模块加上去的。一个对象上的同样字段不应该在视图里出现两次的。<br /><br /><br /><br />



  • ;D校长过奖了,还得多谢校长指点啦<br /><br />我还有个问题想咨询一下,xpath 和 name 定位的方式有什么区别?哪个比较好呢?



  • name 一般能唯一定位的话,用name就可以了,xpath则可以精确定位,依据DOM规则


  • 管理员

    你其实已经发现了。<br />用字段名定位的方法,对某种情况下是无法处理的。必须用xpath<br />比如,要定位销售订单行上的name字段,用字段名定位就做不到了。<br />因为销售订单(sale.order)上有name字段,在order的视图里同样有订单行(sale.order.line)的name字段, 这就必须用xpath来定位了。<br />另外,xpath提供灵活定位方式可以通过相对路径定位到xml的任何一个节点,比如search view里的filter元素等等<br />象上面的例子也可以用下面这些方法定位:<br />[code]<xpath expr="//field[@name='customer']/field[@name='supplier']" position="after">[/code]



  • learned a lot  & thanks a lot.



  • 报告校长,代码<br />[code]<xpath expr="//field[@name='customer']/field[@name='supplier']" position="after">[/code]<br />还是行不通 :-\,好像customer跟supplier是并列的。<br /><br />我试了一下,这样是可以的:<br />[code]<br />xpath expr="//page[@string='Sales &amp; Purchases']/group/group/field[@name='supplier']" position="after"><br />[/code]


  • 管理员

    不好意思,试试下面的:<br /><br /><br />[code]<xpath expr="//field[@name='customer']/../field[@name='supplier']" position="after">[/code]



  • 试了,好用 ;D



  • 高手论剑~~~~~~~~~~~~~~~~~~~~~~~~<br /><br />我来收门票~!!!



  • [quote author=digitalsatori link=topic=16281.msg27626#msg27626 date=1394788274]<br />不好意思,试试下面的:<br /><br /><br />[code]<xpath expr="//field[@name='customer']/../field[@name='supplier']" position="after">[/code]<br />[/quote]<br /><br />求教一下吃个快餐,  这里的两个点 ..  怎么理解?



  • [quote author=ccdos link=topic=16281.msg27632#msg27632 date=1394885702]<br />[quote author=digitalsatori link=topic=16281.msg27626#msg27626 date=1394788274]<br />不好意思,试试下面的:<br /><br /><br />[code]<xpath expr="//field[@name='customer']/../field[@name='supplier']" position="after">[/code]<br />[/quote]<br /><br />求教一下吃个快餐,  这里的两个点 ..  怎么理解?<br />[/quote]<br /><br />个人感觉应该跟linux中的cd ..差不多意思,先找到customer的父节点,然后在该父节点下找supplier。



  • 明知道是两个,可以直接找第二个(或者叫最后一个的)<br /><br />http://shine-it.net/index.php?topic=14508.0



  • [quote author=Jeff link=topic=16281.msg27647#msg27647 date=1395063648]<br />明知道是两个,可以直接找第二个(或者叫最后一个的)<br /><br />http://shine-it.net/index.php?topic=14508.0<br />[/quote]<br /><br />谢谢Jeff大神分享,有学了一招。


登录后回复
 

与 Odoo 中文社区 的连接断开,我们正在尝试重连,请耐心等待