ODOO13 当XML中的 context 的默认值遇到 readonly

如果我们想要通过一个动作、其他视图中的关联字段或者一个按钮,打开一个视图,并为此视图中的某个字段传递一个默认的值,我们通常会使用 context 属性,就像下面这样,为 purchase_requisition 字段赋默认值为 tenders,并在目标视图中,增加这个字段,以接收默认值:

<!-- 传递参数 -->
context="{'default_purchase_requisition': 'tenders'}" />
<!-- 接收默认参数 -->
<field name="purchase_requisition" />

本人遇见问题,是在拓展res.partner模型的时候,我为此模型增加了新的字段:客户类型(customer_type),是个Selection字段,含连个选项:公司和公司联系人。并根据这两的值作为过滤项,分别创建了视图,为form视图创建传递了默认值。

<!-- 公司 -->
<field name="domain">[('customer_type', '=', 'company')]</field>
<field name="context">{'default_customer_type': 'company'}</field>
<!-- 员工 -->
<field name="domain">[('customer_type', '=', 'employee')]</field>
<field name="context">{'default_customer_type': 'employee'}</field>

 另外还在res.partner模型中,增加了两个字段,company_id 和 employee_ids , 前者是给 customer_type 为 employee 使用的,指定他是哪个公司的,后者是给 customer_type 为 company 使用的,列出公司下的员工。因此在两个视图中添加代码如下:

员工客户视图中简单,只增加了 customer_type 字段,并设成了 readonly :

<field name="customer_type" readonly="1"/>

公司客户视图中增加了一个tree,tree 下还列出了三个字段,

<field name="customer_type" readonly="1"/>

<field name="member_ids" 
    context="{'form_view_ref': 'xxxx.view_company_add_employee_form','default_customer_type': 'employee','default_family_id':active_id}">
    <tree>
        <field name="name"/>
        <field name="customer_type"/>
        <field name="note"/>
    </tree>
</field>

为了能使在tree 中增加新的员工客户,还写了一个专门的视图 view_company_add_employee_form:

<field name="customer_type" readonly="1"/>
<field name="name"/>
....

这时候,问题就真的来了,我在通过 tree 创建员工客户时,打开的 view_company_add_employee_form 弹出框中,显示customer_type 是默认值 employee,这时候,没毛病。填写好信息,点击弹出框保存按钮后,在tree 中看到的customer_type 也是 employee,这时候,也没毛病。但当我保存 公司客户后,添加的员工客户 的customer_type 全变成了 company。这是个什么熊毛病?

先捋一捋上面的流程,我打开了创建公司客户的视图,这时候默认 customer_type 的默认值是 company,显示的也确实是company;然后我又通过公司客户中的 tree 打开了添加员工客户的form视图,这时候的 customer_type 的默认值是 employee,显示的确实是 employee,保存员工客户后,tree上显示的也是employee;最后保存公司客户后,公司客户下面 的tree 里的员工 客户的类型,竟变成了 company 。为啥?

我将create 方法中的创建参数进行了打印,发现没有 customer_type 键值对:

{
    'employee_ids': [
        [4, 41, False], 
        [4, 34, False], 
        [0, 'virtual_176', {'company_id': 64, 'name': 'wwww'}]
    ]
}

思来想去,又扒了扒源代码,确定是 readonly 搞的鬼,一般情况下,readonly 标记的字段不会出现在创建(或编辑)参数中。视图中虽显示为employee,但其实customer_type 是没有值的。保存时,不能捕获到显示值 employee。既然没有出现在参数中,为什么却又变成了company ?因为最后保存公司客户的时候,在这里有个默认的参数键值对customer_type = company 。

知道是readonly 的问题,我将 readonly 改成了 invisible 。 如果兄弟们就是想看到这个类型,只需要在view_company_add_employee_form  上的字段段上增加属性:

<field name="customer_type" readonly="1" force_save="1"/>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章