跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. Openerp 中的 readonly

Openerp 中的 readonly

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
10 帖子 6 发布者 6.0k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • C 离线
    C 离线
    ccdos
    写于 最后由 编辑
    #1

    关于 OE 中 readonly 属性,其 本质跟我们平常 的定义有些许 不同,它直接就 禁止了form界面中的字段值写入到数据库。

    我们常用(至少我常用)的 readonly 字段,往往是希望,该字段的数值 是由程序产生和赋值,禁止人工修改,但是 这个值是需要写入到数据库的,
    但我们的愿望跟 OE 的处理是不一样的。

    这里有以前的讨论:

    【求助】如何实现添加采购明细时,采购员不能修改采购单价?<br / [检测到链接无效,已移除] br />

    今天在群里问了众位大牛,恕不一一列名了
    给出了几个方法,我自己尝试了一个感觉 较简单的,

    就是方法1 , 在 意图 只读的字段 也定义一个 onchange 函数,该函数直接使用 计算该字段值的  onchange,
    这样修改后,就会 自动强行再计算一遍,又是我们希望的数值了。

    <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;metric_spec&quot; on_change=&quot;onchange_metric_spec(metric_spec,stratify_base,nwtid)&quot;&nbsp; &nbsp; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;input_type&quot;/&gt;<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;field name=&quot;product_id&quot; on_change=&quot;onchange_metric_spec(metric_spec,stratify_base,nwtid)&quot;&nbsp; /&gt;<br /><br />
    




    方法2,

    我自己还尝试了一个 比较 暴力的方法, 用 domain 将该字段的值 限定在其自身。

    但是 这方法 似乎不通用,非引用值 的 字段可以吗?

    <br />&nbsp; &nbsp; &nbsp; &nbsp; &#039;product_id&#039;: fields.many2one(&#039;product.product&#039;, u&#039;对应产品&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  domain=&quot;[(&#039;id&#039;, &#039;=&#039;, product_id)]&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ),<br />
    




    方法3:
    就是重载model的  write 函数,重新计算一次 只读字段的值,并加入到 vals 中,使之写入。 感觉为了一个 只读,涉及多处改写,有点麻烦.
    但是 这个 用户体验是比较好的,跟我们 平常的只读逻辑一样。只是在界面 处理后数据保存时 计算了两次


    方法4,  这是 我最希望 完成的方法, 就是 改变Oe 的处理逻辑,
    webclient 传递到 server 数据中,能包含 readonly 的值,而不是直接忽略。
    哪位能 指点 一二 ?

    1 条回复 最后回复
    0
    • mrshellyM 离线
      mrshellyM 离线
      mrshelly
      写于 最后由 编辑
      #2

      搬凳子.... 围观..........

      1 条回复 最后回复
      0
      • 1 离线
        1 离线
        18684036
        写于 最后由 编辑
        #3

        我觉得最大的可能性就是 readonly字段,OE不写入vals中,而在onchange中,又不能控制vals,所以导致了这个字段无法保存

        1 条回复 最后回复
        0
        • wjfonhandW 离线
          wjfonhandW 离线
          wjfonhand
          写于 最后由 编辑
          #4

          赞第一种解法,实现简单。
          虽然用户体验不太好,改了白改。。。

          GoodERP -- Odoo China fork

          1 条回复 最后回复
          0
          • JoshuaJ 离线
            JoshuaJ 离线
            Joshua 管理员
            写于 最后由 编辑
            #5

            第一种解法让他们“改了白改”之余,还可以返回一个waring,让他们明白为什么“改了白改”。

            【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

            1 条回复 最后回复
            0
            • mrshellyM 离线
              mrshellyM 离线
              mrshelly
              写于 最后由 编辑
              #6

              我还是推荐

              字段 readonly 然后 onchange 后改变,

              再在 default 中, 取 onchange 的结果 返回.

              1 条回复 最后回复
              0
              • C 离线
                C 离线
                ccdos
                写于 最后由 编辑
                #7

                不明觉历 :-[

                “在 default 中, 取 onchange 的结果”

                不会做

                1 条回复 最后回复
                0
                • digitalsatoriD 离线
                  digitalsatoriD 离线
                  digitalsatori 管理员
                  写于 最后由 编辑
                  #8

                  为什么不把需要只读但是需要内部计算的字段定义成function field呢?

                  就象‘产品’对象的incoming, outgoing字段,其值是动态变化的,但是对用户是只读的,它们都是function字段

                  【上海先安科技】(tony AT openerp.cn)

                  1 条回复 最后回复
                  0
                  • JoshuaJ 离线
                    JoshuaJ 离线
                    Joshua 管理员
                    写于 最后由 编辑
                    #9

                    [quote author=digitalsatori link=topic=6052.msg15224#msg15224 date=1368024061]
                    为什么不把需要只读但是需要内部计算的字段定义成function field呢?
                    [/quote]

                    我刚开始也建议直接function field 然后加个 “计算” 按钮

                    【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                    1 条回复 最后回复
                    0

                    • 登录

                    • 没有帐号? 注册

                    • 登录或注册以进行搜索。
                    • 第一个帖子
                      最后一个帖子
                    0
                    • 版块
                    • 标签
                    • 热门
                    • 用户
                    • 群组