如何在OpenERP7中的fields_view_get中只读取一个字段?

时间:2015-01-09 20:37:35

标签: openerp-7

我想要的是什么:

基于两个必须存在的上下文变量(一个默认值和一个标志),我必须只读一个字段。如果不存在任何一个上下文变量,则该字段应该像往常一样进行编辑。

我有这个文件:

from osv import fields, osv
from lxml import etree


class ir_sequence(osv.osv):
    _name = 'ir.sequence'
    _inherit = 'ir.sequence'

    def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
        """
        We set the field to readonly depending on the passed flags. This means:
           * We must specify to fix the sequence type (fixed_sequence_type=True).
           * We must specify a default value for the "code" (default_code=my.custom.seq.code).

        This only applies to context (e.g. a context node in a ir.action.act_window object, or a <field /> tag for a
           relational field to this object, with a context with these values).
        """
        res = super(ir_sequence, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type,
                                                       context=context, toolbar=toolbar, submenu=submenu)
        context = context or {}
        is_fixed = context.get('fixed_sequence_type', False) and bool(context.get('default_code', False))
        if is_fixed and 'code' in res['fields']:
            res['fields']['code']['readonly'] = 1
            #arch = etree.XML(res['arch'])
            #for node in arch.xpath("//field[@name='code']"):
            #    node.set('readonly', '1')
            #res['arch'] = etree.tostring(arch)

        return res

ir_sequence()

我尝试了两种方法,在满足条件时将字段的readonly属性更改为True(条件由is_fixed变量给出 - 通过调试我看到它获得所需的True值,当我以预期的方式触发它。)

第一种方法是将arch内容编辑为XML,找到字段&#39; code&#39;的节点,然后修复它。该备选方案的代码已注释。

第二种选择是编辑字段字典,找到&#39;代码&#39;字段,并在该字段上设置readonly = True。

它们都没有工作(症状:当条件评估为True时,该字段不是只读)。

我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

试试这个,

  <field name="field_name" invisible="context.get('flag1',False) and context.get('flag2',False)" />

您可以使用绑定到列表视图的操作将上下文传递给列表视图。

<record id="action_account_tree1" model="ir.actions.act_window">
   <field name="name">Analytic Items</field>
   <field name="res_model">account.analytic.line</field>
   <field name="view_type">form</field>
   <field name="view_mode">tree,form</field>
   <field name="context">{'flag1':True,'flag2':True}</field>
</record>

您必须根据需要管理逻辑条件。

如果您的目的是根据上下文隐藏列表视图中的字段,则无需覆盖fields_view_get。

感谢。