美文网首页我爱编程
odoo二次开发 心血总结(已停更)

odoo二次开发 心血总结(已停更)

作者: 叽翅 | 来源:发表于2018-04-09 15:52 被阅读0次

    2018-04-09

    • py文件更新则重启odoo,xml文件更新则升级模块(有特例,py里涉及字段增删的也要升级模块)
    • XML文件比较严格,但凡一点错odoo系统都要崩溃
    • models.py里的class内容一定不能为空,比如只写个pass,就会报错
    • xml继承只和ref和models有关
    • 如果有安装却看不到某模块,是因为设置里没给该用户分配访问权限
    • odoo中为错误的sql语句(比如update)写try是不起作用的,odoo的pgsql遇到这种会直接把事务给锁上。前面有错误的sql语句执行了,会直接锁住,就算finally写的正确sql语句也执行不了
    • 当field或button position='replace' 用不了的时候,试试改成xpath
    • xml标签内值为空是不可以的
    • odoo对非大量经验者真的是不友好、但是经验越多越轻松 /微笑
    • odoo的onchange所依赖的值,必须在前端显现出来,这个函数才会生效!!!
    • 并且,onchange方法修改值用的是前端方法,所以属性readonly是不能这样通过self.xxx来修改的
    • odoo的tree视图所含的字段,其model里的定义中不能写states=xxx,会读取不到state的
    • odoo的带有compute并且store=True字段,并且store=True的情况下,不能用self直接为其赋值,要报错的,需要这么写:
    last_date = fields.Datetime('最后修改时间', compute='_compute_date', store=True)
    
    @api.depends。。。
    def _compute_date(self):
        # 更新最后修改时间
        for x in self:
            x.last_date = x.write_date
    

    2018-07-09

    • 单子底部的消息怎么搞?见https://www.jianshu.com/p/84c6518d7dbf
    • 题外话,Pycharm在服务运行的时候,直接关软件的话,不要点Disconnect,这样只会断开pycharm和python,会让python.exe在后台运行,有好几次改py文件不生效都是它搞的鬼
    • compute,store的compute的字段不可加copy=False。 (貌似。。)
    • 在xml view里写domain,表示“或”用波兰表达式的'|'
      例如<field name="x" domain="['|', ('a', '=', True), ('b','=',True)]"/>
      但是如果想表示且的话就不是'&'了,而是什么都不加
      <field name="x" domain="[('a', '=', True), ('b','=',True)]"/>

    2018-08-01

    • 在写跳转出的小窗口的时候,明明在跳转函数return带上了context,为什么小窗口的子表的后台还是取不到context呢?
      是因为需要在xml里的 子表那个ids字段上面把context传进去,才可以接受得到
    # stock.pack.operation模型
    @api.multi
    def action_split_lots(self):
        res = super(StockPackOperation, self).action_split_lots()
    
        res['context']['product_id'] = stock.product_id.id
        res['context']['location_id'] = self.location_id.id
        return res
    
    <!--xml-->
    <field name="pack_lot_ids" nolabel="1" context="{'product_id': context.get('product_id'),'location_id': context.get('location_id')}">
    
    • 附:后续domain过滤

    因为弹窗这种默认的self是new object的对象,是没有加上父表的任何信息的,在未保存时是关联不到父表的,因此上述通过context传值进来

    这里是想要接收父表跳转动作传递的location_id和product_id,然后对lot_id根据domain进行过滤

    @api.onchange('lot_id')
    def _onchange_lot_id(self):
        product_id = self._context.get('product_id')
        location_id = self._context.get('location_id')
        lot_ids = []
        stock_quant = self.env['stock.quant'].search([('location_id','=',location_id),('product_id','=',product_id),('qty','>','0')])
        for x in stock_quant:
            if x.lot_id.id:
                lot_ids.append(x.lot_id.id)
        domain = [('id', 'in', lot_ids)]
        return {'domain': {'lot_id': domain}}
    

    2018-10-30

    • 想要在模块安装的时候初始化一些数据,XML比较不优雅,所以采用在model层的,继承修改模块安装时调用的函数的方式,比如_auto_init(),来初始化数据
    class DemoModel(models.Model):
        # ......
        @api.model_cr_context
        def _auto_init(self):
            # Here to write your code
            return super(DemoModel, self)._auto_init()
    
    • 更正,如果是新写的模型,为了初始化数据的话,上面的方法是错的,因为auto_init执行时,还没创建出该模型的数据表,auto_init之后才有数据表。
      所以改用init方法,是直接重写还是继承要看其他代码的地方有没有重写init。
    @api.model_cr
        def init(self):
            # Here to write your code
    

    2018-11-20

    • update()是调用js的改变前端数值,write()是在数据库层面改变数值
      建议当前页面@onchange修饰的方法内用update(),而其他页面的或者通过按钮改变的用write()

    相关文章

      网友评论

        本文标题:odoo二次开发 心血总结(已停更)

        本文链接:https://www.haomeiwen.com/subject/voyihftx.html