是否可以使用外部ID(而非内部ID)比较视图中的字段。我需要这个,因为我需要根据其他字段隐藏一些字段。我可以使用内部数据库ID来完成这项工作。因此,如果用户选择例如country(在视图中它检查国家ID),如果id匹配以便进行比较,则显示另一个字段。例如:
<field name="some_field"
attrs="{'invisible': [('country_id','!=',10)]}"
/>
这个有效,但它并不可靠。想象一下,如果id会改变(例如安装我的模块,其中某个其他国家已经使用了id),那么当选择不同的国家时它会显示some_field
。这不是故意的。
所以我考虑使用外部id,在将数据添加到xml文件中的表时提供。该id是静态的,实际上对于您将安装该模块的任何数据库应该是相同的(因为该ID在模块本身中提供,不是由数据库自动创建的)。
有没有办法使用这个相同的功能,但使用外部ID?
当然也许有人知道更好的方法来解决这个问题吗?
P.S。添加另一个字段如boolean来显示隐藏some_field
不是一个选项,因为它完全取决于将在模块安装时添加的特定值。
答案 0 :(得分:1)
您可以使用fields_view_get添加此功能。例如
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
if context is None:context = {}
res = super(your_osv_class_name, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=False)
doc = etree.XML(res['arch'])
nodes = doc.xpath("//field[@name='some_field']")
id_found = self.pool.get('res.country').search(cr, uid,[('name','=','India')])[0]
#or try to search for the id using the external id
for node in nodes:
node.set('attrs', "{'invisible':[('country_id','=',%s)]}"%id_found)
setup_modifiers(node, res['fields']['some_field'])
res['arch'] = etree.tostring(doc)
return res