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

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

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

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

Xpath 增加 on_change 响应事件 分享及求指点



  • 为某些字段增加on_change 响应事件 ,可以使用xpath  修改属性:修改属性能够实现的功能,
    position="attributes"
    [code]
                        <xpath expr="//field[@name='name']" position="attributes">
                            <attribute name="required">1</attribute>
                        </xpath>
    [/code]

    本例为 discount 增加 响应事件,需求来自于实际折扣为具体金额,而系统中计算的全是百分比的discount,需要提供一个具体金额的输入点,折算为 百分比,同时,输入百分比 具体折算金额也应该显示。 则新增字段discount_value
    [code]
      <xpath expr="//field[@name='discount']" position="attributes">
                            <attribute name="on_change">
                            discount_change(product_uom_qty,price_unit,discount,context)
                            </attribute>
                    </xpath>
    [/code]
    py 对应代码  其中 'discount_value' 为新增加字段,
    [code]
    def discount_change(self, cr, uid, ids, product_uom_qty=1,price_unit=0,discount=0,context=None):

            value = {
                        'discount_value':0,
                }
            if product_uom_qty * price_unit > 0:
              try:
                    value.update({
                    'discount_value':  ( product_uom_qty * price_unit)discount0.01
                 
                    })
                except ZeroDivisionError:  # 这个地方没删掉,,,copy 过来的
                        pass
            return {'value': value}

    [/code]


    discount_value界面代码  其中<label  > 都没起效 
    [code]
    <xpath expr="//div[@name='discount']" position="after">
                 
                    <label for="discount_value123" />
                 
                    <div name="discount_value" groups="sale.group_discount_per_so_line">
                        <field name="discount_value" string ="discount_value1"
                        on_change="discount_value_change(product_uom_qty,price_unit,discount_value,context)"
                        />
                        <label for="discount_value1235" />
                    </div>
                    <label for="discount_value1243" />
                </xpath>
    [/code]



    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2862;image[/img]


    加上[code]
                  <xpath expr="//label[@for='discount']" position="after">
                 
                    <label for="discount_value123" />
                 
                 
                </xpath>[/code]


    排成。。。。。。
    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2864;image[/img]

    用了一段超长的xpath 解决问题

    [code]

    <xpath expr="//notebook/page[@string='Order Lines']/field[@name='order_line']/form[@string='Sales Order Lines']/group/group"
                    position="inside">
                 
                        <field name="discount_value"
                        on_change="discount_value_change(product_uom_qty,price_unit,discount_value,context)"
                        />
                  </xpath>
    [/code]


    顺便 发个  XPath 语法链接  http://www.w3school.com.cn/xpath/xpath_syntax.asp
    openerp学习笔记 视图继承(tree、form、search)http://www.cnblogs.com/cnshen/p/3164275.html
    界面问题解决了,实际测试时发现,discount 和discount_value 字段都设置了on_change 响应,而且都是改对方的值,杯具了,修改discount或discount_value  时 不停的执行。。。。on_change  死循环了
    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2866;image[/img]

    求 指点[img2]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2866;image[/img2]



  • 为某些字段增加on_change 响应事件 ,可以使用xpath  修改属性:修改属性能够实现的功能,
    position="attributes"
    [code]
                        <xpath expr="//field[@name='name']" position="attributes">
                            <attribute name="required">1</attribute>
                        </xpath>
    [/code]

    本例为 discount 增加 响应事件,需求来自于实际折扣为具体金额,而系统中计算的全是百分比的discount,需要提供一个具体金额的输入点,折算为 百分比,同时,输入百分比 具体折算金额也应该显示。 则新增字段discount_value
    [code]
      <xpath expr="//field[@name='discount']" position="attributes">
                            <attribute name="on_change">
                            discount_change(product_uom_qty,price_unit,discount,context)
                            </attribute>
                    </xpath>
    [/code]
    py 对应代码  其中 'discount_value' 为新增加字段,
    [code]
    def discount_change(self, cr, uid, ids, product_uom_qty=1,price_unit=0,discount=0,context=None):

            value = {
                        'discount_value':0,
                }
            if product_uom_qty * price_unit > 0:
              try:
                    value.update({
                    'discount_value':  ( product_uom_qty * price_unit)discount0.01
                 
                    })
                except ZeroDivisionError:  # 这个地方没删掉,,,copy 过来的
                        pass
            return {'value': value}

    [/code]


    discount_value界面代码  其中<label  > 都没起效 
    [code]
    <xpath expr="//div[@name='discount']" position="after">
                 
                    <label for="discount_value123" />
                 
                    <div name="discount_value" groups="sale.group_discount_per_so_line">
                        <field name="discount_value" string ="discount_value1"
                        on_change="discount_value_change(product_uom_qty,price_unit,discount_value,context)"
                        />
                        <label for="discount_value1235" />
                    </div>
                    <label for="discount_value1243" />
                </xpath>
    [/code]



    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2862;image[/img]


    加上[code]
                  <xpath expr="//label[@for='discount']" position="after">
                 
                    <label for="discount_value123" />
                 
                 
                </xpath>[/code]


    排成。。。。。。
    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2864;image[/img]

    用了一段超长的xpath 解决问题

    [code]

    <xpath expr="//notebook/page[@string='Order Lines']/field[@name='order_line']/form[@string='Sales Order Lines']/group/group"
                    position="inside">
                 
                        <field name="discount_value"
                        on_change="discount_value_change(product_uom_qty,price_unit,discount_value,context)"
                        />
                  </xpath>
    [/code]


    顺便 发个  XPath 语法链接  http://www.w3school.com.cn/xpath/xpath_syntax.asp
    openerp学习笔记 视图继承(tree、form、search)http://www.cnblogs.com/cnshen/p/3164275.html
    界面问题解决了,实际测试时发现,discount 和discount_value 字段都设置了on_change 响应,而且都是改对方的值,杯具了,修改discount或discount_value  时 不停的执行。。。。on_change  死循环了
    [img]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2866;image[/img]

    求 指点[img2]http://shine-it.net/index.php?action=dlattach;topic=14532.0;attach=2866;image[/img2]


  • 管理员

    需要再加个判断来实现不要重新返回数值。
    [code]
    <xpath expr="//field[@name='discount']" position="attributes">
                            <attribute name="on_change">
                            discount_change(product_uom_qty,price_unit,discount,discount_value,context)
                            </attribute>
                    </xpath>
    [/code]

    [code]
    def discount_change(self, cr, uid, ids, product_uom_qty=1,price_unit=0,discount=0,context=None):
        if discount_value == ( product_uom_qty * price_unit)discount0.01:
            return {}
    ...
    [/code]
    同理 discount_value_change 也要。



  • 3Q 后来这么干了一下,解决了。
    [code]
    if  abs(newdiscount-discount)>0.001:       
                return {'value': value} 
            else:
                return {'value': {}}   

    [/code]



  • 我通常在几个同时使用 on_change  的时候. 加一个 from field 的参数



  • 学习了!尝试一下!


登录后回复
 

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