asd*_*232 5 python forms default-value openerp
我在 OpenERP 中定义了几个自定义对象,它们应该在多公司环境中使用。因此,每个对象定义一个“company_id”字段。这是所有设置和工作正常。只是,用户界面不是很用户友好,因为用户需要明确选择新对象实例应该属于的公司。
company_id 字段的设置方式如下:
...
'company_id' : fields.many2one('res.company', string='Company', selection=compute_company_select, required=True)
...
def compute_company_select(self, cr, uid, context):
c_proxy = self.pool.get('res.company')
user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
search = [('id', 'child_of', user.company_id.id)]
if uid == SUPERUSER_ID:
search = [] #superuser can assign any company
ids = c_proxy.search(cr, uid, search, context=context)
return [(c.id, c.name) for c in c_proxy.browse(cr, uid, ids, context=context)]
Run Code Online (Sandbox Code Playgroud)
我也可以通过使用“compute_company_select”函数中的搜索域在字段定义中简单地定义域表达式来解决这个问题。除了超级用户无法分配所有公司之外,如果他没有被配置为有权访问所有公司。
我现在想要做的是在创建新记录时用用户公司预先填充 company_id 字段。而这似乎是不可能的。我发现了几种使用静态值或模块 XML 中定义的值预填充字段的可能性。但是似乎没有选项可以使用仅在运行时可用的值,即当前用户记录。
我正在使用 OpenERP 6.1。
官方 OpenERP 插件中的许多文档都具有类似的多公司功能,因此您大概应该重用相同的实现技术,它似乎与您的用例相匹配。
这里有很多例子的源代码,如果你搜索"company_id"或者"company_id.*fields.many2one",例如销售商店中sale的模块。
简而言之,您将需要:
将company_id字段声明为many2one向的常规字段res.company。默认安全记录规则(在此处定义)将负责动态显示仅作为用户当前公司子公司的公司。用户可以随时在首选项中将他们当前的公司更改为他们允许的任何公司,以在不同的公司环境中工作。并且由于安全记录规则不适用于特殊的管理员用户,因此在以管理员身份登录时始终可以选择任何公司。
'company_id': fields.many2one('res.company', 'Company', required=False)
Run Code Online (Sandbox Code Playgroud)创建新记录时自动选择用户当前的公司作为默认值。该框架提供了一种正是这样做的:res.company._company_default_get()。可以定义自定义规则来为每种文档选择默认公司,但默认值将是用户的当前公司。因此,只需将此代码段添加到您的模型的_defaults:
'company_id': lambda self,cr,uid,ctx: self.pool['res.company']._company_default_get(cr,uid,object='<your_model>',context=ctx)
Run Code Online (Sandbox Code Playgroud)将该company_id字段添加到模型的表单视图中。通常你想把它限制在multi-company组内,只显示给真正需要它的用户:
<field name="company_id" groups="base.group_multi_company"/>
Run Code Online (Sandbox Code Playgroud)应该就是这么简单。
| 归档时间: |
|
| 查看次数: |
3985 次 |
| 最近记录: |