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

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

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

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

odoo中表单中添加按钮点击会出发保存表单中的内容?



  • 我在odoo的开发中遇到自定义按钮的问题,就是我在表单中添加了一个按钮,用于其他自定义操作的,但是每次点击就会触发保存表单中的内容。我的目的是我点击自定义按钮后弹出一个选择层,选择后在点击odoo自己的保存按钮,是要达到这样一个效果,选择我还没有选择选项就已经把 表单中的内容就已经保存了,这样的话我不选择也保存了一个表单的内容,这个是不需要的。



  • <record model="ir.ui.view" id="taony_test_demo2_form">
    <field name="name">taony_test_demo2 form</field>
    <field name="model">taony_test_demo2.taony_test_demo2</field>
    <field name="arch" type="xml">
    <form>
    <header>
    </header>
    <sheet>
    <group>
    <group>
    <field name="name"></field>
    <field name="demo1"></field>
    <field name="demo2"></field>
    <field name="demo3"></field>
    <field name="demo4"></field>
    <field name="demo1_id"></field>
    </group>
    </group>
    <notebook>
    <page string="tab1">
    <button name="sure" string="test" class="oe_highlight"></button>
    </page>
    </notebook>
    </sheet>
    </form>
    </field>
    </record>
    这个是表单中的xml文件,我在表单底部添加了一个测试按钮,每次我点击测试按钮,都会自动保存表单的内容,生成一条记录。而我想要的是我点击按钮后,做了相应的操作在点击odoo自己的保存按钮再进行保存,不然我什么都没操作点击它就保存了一条记录,要是我取消呢,点击了也是生成一条记录。
    这个按钮点击事件我可以在哪里可以修改,我全局都不想要这种保存方式。
    希望各位大神帮帮忙。。。



  • 主要是想知道js是在哪里定义写的,现在odoo里面不管在那个表单里面添加按钮<button></button>都会,点击都会进行表单保存事件。



  • 自己写个带按钮的widget,

    参考文件上传widget,

    js:
    web/static/src/js/views/form_widgets.js

    var FieldBinary = common.AbstractField.extend(common.ReinitializeFieldMixin, {

    xml:

    web/static/src/xml

    <t t-name="FieldBinaryFile">
    <t t-if="!widget.get('effective_readonly')">
    <table class="oe_form_field oe_form_field_binary" cellpadding="0" cellspacing="0" border="0" t-att-style="widget.node.attrs.style">
    <tr>
    <td>
    <input type="text" size="1" readonly="readonly"
    t-att-name="widget.name"
    t-att-tabindex="widget.node.attrs.tabindex"
    t-att-autofocus="widget.node.attrs.autofocus"
    class="field_binary"
    />
    </td>
    <td class="oe_form_binary" nowrap="true">
    <table cellspacing="0" cellpadding="0" border="0">
    <tr>
    <td>
    <t t-call="HiddenInputFile">
    <t t-set="fileupload_id" t-value="widget.fileupload_id"/>
    <t t-set="fileupload_style" t-translation="off">overflow-x: hidden</t>
    <button class="oe_button oe_field_button" type="button">
    <img t-att-src='_s + "/web/static/src/img/icons/STOCK_DIRECTORY.png"'/>
    <span>Select</span>
    </button>
    </t>
    </td>
    <td>
    <a class="oe_form_binary_file_save_data">
    <button class="oe_button oe_form_binary_file_save" type="button" title="Save As">
    <img t-att-src='_s + "/web/static/src/img/icons/gtk-save.png"'/>
    <span>Save As</span>
    </button>
    </a>
    </td>
    <td>
    <button class="oe_button oe_form_binary_file_clear" type="button" title="Clear">
    <img t-att-src='_s + "/web/static/src/img/icons/STOCK_MISSING_IMAGE.png"'/>
    <span>Clear</span>
    </button>
    </td>
    </tr>
    </table>
    </td>
    <td class="oe_form_binary_progress" style="display: none" nowrap="true">
    <img t-att-src='_s + "/web/static/src/img/throbber.gif"' width="16" height="16"/>
    <b>Uploading ...</b>
    </td>
    </tr>
    </table>
    </t>
    <t t-if="widget.get('effective_readonly')">
    <span t-att-style="widget.node.attrs.style">
    <a href="javascript:void(0)" class="oe_form_uri"/>
    </span>
    </t>
    </t>



  • 但是我在xml里面有写name的方法,然后是.py里面定义的,要是用widget那就不会出写在py文件中的事件了。我附上代码你看下。



  • @siyuan 但是我在xml里面有写name的方法,然后是.py里面定义的,要是用widget那就不会出写在py文件中的事件了。我附上代码你看下。



  • @siyuan 0_1502696246607_微信图片_20170814153632.png
    这个是xml文件中定义的button
    另外button中的name就是py文件中模块下定义的方法,代码如下:
    0_1502696336054_微信图片_20170814153847.png
    我目前只是为了测试,所以没有写如其他的操作,只是为了解决点击按钮保存表单数据的问题。



  • @siyuan 一般定义的name方法是用来操作模块数据的,我另外的方法代码:
    0_1502697401945_微信图片_20170814155628.png



    1. odoo js框架 的修改属于比较中高级的,如果不是对最基本的xml+.py文件很熟悉的话,
      我不介意你修改js (当然我不知道你有什么具体业务需要,导致目前的odoo框架满足不了需求)

    2. 你在xml文件里面加button,走的肯定还是odoo js 框架默认的form 渲染流程,按钮点击会触发保存事件。

    如果你不要触发保存事件.

    A. 修改web模块里面form view 的保存机制,但除非你对odoo js 框架非常熟悉,不然不推荐,因为不知道会不会改出其他问题。

    B. 参考附件上传widget,自己写个widget,和form view 本身独立开,自己控制widget上的按钮事件,这个和.py文件的通讯要自己解决。
    (odoo js 框架本身有封装调用.py的方法,call_kw)

    如果你是odoo 初学者,我不介意你这么做;真有需要,最好找资深的二次开发的人员咨询(应该会收费)



  • @siyuan 非常感谢你,谢谢这么全面友好的建议,非常感谢。



  • 我已经解决了这个bug,我是在odoo前端js基础上进行调整的,代码也非常简单,只是在找事件代码花费了一天多的时间,有需要的调整的朋友可以直接联系我。



  • @Siyuan 也非常感谢管理员@Siyuan 的帮助和建议,非常感谢。


  • 管理员

    你可以试试用action类型的按钮

    <button name='foo' type='action'/>



  • @siyuan 你好,请问下具体的js调用.py的方法是在哪里呢?或是具体的方法名知道吗?知道这个下次也好自定义按钮。



  • @鲍永道

    web/static/src/js/framework/model.js

    /**
     * Call a method (over RPC) on the bound OpenERP model.
     *
     * @param {String} method name of the method to call
     * @param {Array} [args] positional arguments
     * @param {Object} [kwargs] keyword arguments
     * @param {Object} [options] additional options for the rpc() method
     * @returns {jQuery.Deferred<>} call result
     */
    call: function (method, args, kwargs, options) {
        args = args || [];
        kwargs = kwargs || {};
        if (!_.isArray(args)) {
            // call(method, kwargs)
            kwargs = args;
            args = [];
        }
        var call_kw = '/web/dataset/call_kw/' + this.name + '/' + method;
        return session.rpc(call_kw, {
            model: this.name,
            method: method,
            args: args,
            kwargs: kwargs
        }, options);
    },


  • @siyuan 非常感谢,我具体需要研究下,方便下次自定义使用,再次感谢。



  • @鲍永道
    我想知道odoo服务端怎么跟前端联系的,还有就是前端通过attr设置的必填的选项,这个odoo是怎么检查的?


  • 管理员

    @1234567odoo中表单中添加按钮点击会出发保存表单中的内容? 中说:

    @鲍永道
    我想知道odoo服务端怎么跟前端联系的,还有就是前端通过attr设置的必填的选项,这个odoo是怎么检查的?

    服务器端跟前端联系?只有websocket这样的协议才有可能实现前后端的双向通信。http协议只有前端向后端发请求,并且是无状态的(就是下一个请求完全不知道上一个请求干了啥),没有反过来的 ;-)



  • @digitalsatori
    我表述的有问题。应该是前端如何向后端发送请求,还有odoo种简单实现按钮变色的js是怎样的,没有html不知如何处理?谢谢指导。


登录后回复
 

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