我想要的是什么:
基于两个必须存在的上下文变量(一个默认值和一个标志),我必须只读一个字段。如果不存在任何一个上下文变量,则该字段应该像往常一样进行编辑。
我有这个文件:
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时,该字段不是只读)。
我该怎么做才能让它发挥作用?
答案 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。
感谢。