On2many字段如何隐藏New button或者只允许建立一条记录
-
系统中,res.partner和res.partner.address是one2many的关系,在客户界面,可以新建任意数量的address记录
我现在有一个自己的class,和res.partner也是one2many的关系,但是现在我想隐层掉界面中的New和delete按钮,也就是只允许建立一条记录。
在网上搜索了一下,有如下的方法可以只建立一条记录,但是无法隐层new按钮:
_sql_constraints = [
('one_address_per_partner', 'UNIQUE(partner_id)', 'You can only create one address per partner'),
]
但是我增加了上面的代码,却得不到任何反应,也就是说仍然可以新建记录。
请问是否有其他更好的办法了直接隐藏按钮的?
谢谢! -
在群里咨询此问题,得到mrshelly指点试用related解决上述问题,不过经过考虑,还是有一些疑问,写出来求教。
自定义类:<br />class res_partner_base_info(osv.osv):<br /> _description ='Partner Information'<br /> _name = 'res.partner.base.info'<br /> _order = 'name'<br /> _columns = {<br /> 'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True),<br /> 'name': fields.char('Name', size=64, select=1),<br /> 'partner_type': fields.many2one('res.partner.type','企业类别'), <br /> 'partner_source': fields.many2one('res.partner.source','客户来源'), <br /> 'partner_brief': fields.text('客户简介'),<br /> } <br />res_partner_base_info()<br />
在res.partner中关联此类:<br />class res_partner(osv.osv): <br /> _name = "res.partner"<br /> _inherit = 'res.partner'<br /> _columns = { <br /> 'base_info': fields.one2many('res.partner.base.info', 'partner_id', 'Base'), <br /> }<br />res_partner()<br />
在crm.lead中关联此类:<br />class crm_lead(osv.osv): <br /> _name = "crm.lead"<br /> _inherit = 'crm.lead'<br /> _columns = { <br /> 'base_info': fields.one2many('res.partner.base.info', 'partner_id', 'Base'), <br /> }<br />crm_lead()<br />
在partner和lead的view中可以使用同样的界面定义:<br /><field colspan="4" mode="form" name="base_info" nolabel="1" select="1" height="260"><br /> <form string="Base Info"><br /> <!--base info的各个字段--><br /> </form><br /></field><br />
这样做的目的就是在销售过程中,在lead中修改的base info的信息与partner的base info信息是同步的,不论销售员在哪里修改均可。
如果使用related实现上述功能的话,我所知的写法如下:<br />class res_partner(osv.osv): <br /> _name = "res.partner"<br /> _inherit = 'res.partner'<br /> _columns = { <br /> 'base_info_id': fields.many2one('res.partner.base.info','Base'),<br /> 'partner_type': fields.related('base_info_id', 'partner_type', type='many2one', string='Partner Type'), <br /> 'partner_brief': fields.related('base_info_id', 'partner_brief', type='text', string='Partner Brief'), <br /> …………#列出res.partner.base.info的所有字段<br /> }<br />res_partner()<br />
上述的写法与使用one2many相比是不是过于复杂了?
在之前我是使用另外的方法实现同样的功能,即base info所有的字段都是定义在res.partner中,而在crm.lead定义相同名称的字段,当lead保存时,重写write函数,将lead中修改过的字段内容update到res.partner中。这样写一开始出了一个问题,因为没有考虑好update的条件,所以某些情况下,lead保存的时候将partner中原有的纪录覆盖掉了。
所以我希望是不论在lead还是在partner中,都操作同一个base info纪录,这样无论如何也不会出错了,如果其他的模块需要调用partner info,那么也可以同样使用base info。
所以使用related是否有更简洁有效的写法呢?
非常感谢! -
通过google找到了一篇帖子,http://www.openerp.com/forum/topic29212.html,其中的示意图完全就是我想要实现的功能,如下:
[attach=1]
我按照其中的代码进行了尝试,不过遇到了几个问题:
1、我只能在view中使用notas_base_id,这样才能在view中显示notas base其中的字段。不过问题就是这些字段无法保存数据
2、view中使用notas_base_id,由于它还是one2many字段,所以,还是默认显示了那个New按钮,与文中所说的实现one2one的功能不太相符。
请问如果采用如下的代码,上述的两个问题如何才能解决呢?
非常感谢!<br />class notas_rel(osv.osv):<br /> _name = 'notas.rel'<br /> _columns = {<br /> 'notas_id': fields.one2many('notas.base','notas_id','Notas'),<br /> }<br /><br />class notas_base(osv.osv):<br /> _name = 'notas.base'<br /> _columns = {<br /> 'name': fields.char('Notas',size=128),<br /> 'notas_id': fields.many2one('notas.rel','Notas'),<br /> }<br /><br />class my_class(osv.osv):<br /> _name = 'my.class'<br /> _columns = {<br /> ...<br /> 'notas_rel_id': fields.many2one('notas.rel','Notas'),<br /> 'notas_base_id': fields.related('notas_rel_id','notas_id',type="one2many", relation="notas.base", string="Notas", store=False),<br /> }<br />
-
既然值允许一个,为什么还要用one2many字段呢?