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字段呢?