odoo many2one 作为选择字段
odoo many2one as selection field
我正在 odoo 中创建一个模块,我想使用 many2one 作为选择字段,问题出在城市的名称上 'ville en francais' 下拉列表有效并保存了城市的 ID(来自数据库)但名称类似于 obj.ville,1(它显示模块名称,id 而不是数据库中的城市名称)
class obj_ghotel(osv.osv):
_name = "obj.ghotel"
_description = "Objet ghotel"
def _get_selection(self, cr, uid, context = None):
ville_obj = self.pool.get('obj.ville')
ville_obj = self.env['obj.ville']
res = []
ville_ids = ville_obj.search(cr, uid, [], context = context)
for g in ville_obj.browse(cr, uid, ville_ids, context = context):
res.append((g.id, g.nom_ville))
return res
_columns = {
'nom_hotel': fields.char( "Nom d'hotel", required=True ),
'adr_hotel': fields.char( "Addresse hotel", required=True ),
'id_ville':fields.many2one('obj.ville','ville', selection=_get_selection), #fields.integer('Id Ville', required=True ), #Foreign key references ville(id) 'id_ville':fields.many2one('ville','ville'),
'image': fields.binary( "Image" ),
}
class obj_ville(osv.osv):
_name = "obj.ville"
_description = "Objet ville"
_columns = {
'nom_ville': fields.char( "Nom Ville", required=True ),
'id_hotel':fields.one2many('obj.ghotel','id_ville'),
}
_defaults = {
'Nom Ville': "Name",
}
Many2one 字段默认为选择字段类型。
首先,您使用 'name' 作为属性
创建 ville 的模型
class OdooVillePerso(models.Model):
_name = 'odoo.ville.perso'
name = fields.Char('Ville')
class OdooFinalClass(models.Model):
_name='odoo.final.class'
...
ville = fields.Many2one('odoo.ville.perso', 'Ville')
之后你可以在另一个模型中调用它作为 Many2one,它会显示为选择字段,但不要忘记为模型创建一个视图。
PS:此代码适用于 odoo 10
最好在 XML no_open & no_edit 中添加选项。
这个问题是当odoo不知道如何表示记录时,他会默认显示模型的名称和记录的id。
odoo 如何知道如何表示记录,这是在 models.py
中定义的 name_get
方法中的 don 首先他查找 _rec_name
的值,默认情况下是 name some i'我假设您在模型 obj.ville
中没有字段名称,我想像 ulilisé nom
^^.
因此您需要更改 _rec_name
:
class Ville(models.Model):
_name = 'obj.ville'
_rec_name = 'nom'
您可以按如下方式使用 _rec_name
:
酒店型号:
class obj_ghotel(osv.osv):
_name = "obj.ghotel"
_description = "Objet ghotel"
_rec_name = 'nom_hotel'
威乐 型号:
class obj_ville(osv.osv):
_name = "obj.ville"
_description = "Objet ville"
_rec_name = 'nom_ville'
您需要定义一个名为 name_get 的方法,如下所示
def name_get(self, cr, uid, ids, context=None):
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]
res = []
for record in self.browse(cr, uid, ids, context=context):
name = record.nom_ville
res.append((record.id, name))
return res
我正在 odoo 中创建一个模块,我想使用 many2one 作为选择字段,问题出在城市的名称上 'ville en francais' 下拉列表有效并保存了城市的 ID(来自数据库)但名称类似于 obj.ville,1(它显示模块名称,id 而不是数据库中的城市名称)
class obj_ghotel(osv.osv):
_name = "obj.ghotel"
_description = "Objet ghotel"
def _get_selection(self, cr, uid, context = None):
ville_obj = self.pool.get('obj.ville')
ville_obj = self.env['obj.ville']
res = []
ville_ids = ville_obj.search(cr, uid, [], context = context)
for g in ville_obj.browse(cr, uid, ville_ids, context = context):
res.append((g.id, g.nom_ville))
return res
_columns = {
'nom_hotel': fields.char( "Nom d'hotel", required=True ),
'adr_hotel': fields.char( "Addresse hotel", required=True ),
'id_ville':fields.many2one('obj.ville','ville', selection=_get_selection), #fields.integer('Id Ville', required=True ), #Foreign key references ville(id) 'id_ville':fields.many2one('ville','ville'),
'image': fields.binary( "Image" ),
}
class obj_ville(osv.osv):
_name = "obj.ville"
_description = "Objet ville"
_columns = {
'nom_ville': fields.char( "Nom Ville", required=True ),
'id_hotel':fields.one2many('obj.ghotel','id_ville'),
}
_defaults = {
'Nom Ville': "Name",
}
Many2one 字段默认为选择字段类型。 首先,您使用 'name' 作为属性
创建 ville 的模型class OdooVillePerso(models.Model):
_name = 'odoo.ville.perso'
name = fields.Char('Ville')
class OdooFinalClass(models.Model):
_name='odoo.final.class'
...
ville = fields.Many2one('odoo.ville.perso', 'Ville')
之后你可以在另一个模型中调用它作为 Many2one,它会显示为选择字段,但不要忘记为模型创建一个视图。
PS:此代码适用于 odoo 10
最好在 XML no_open & no_edit 中添加选项。
这个问题是当odoo不知道如何表示记录时,他会默认显示模型的名称和记录的id。
odoo 如何知道如何表示记录,这是在 models.py
中定义的 name_get
方法中的 don 首先他查找 _rec_name
的值,默认情况下是 name some i'我假设您在模型 obj.ville
中没有字段名称,我想像 ulilisé nom
^^.
因此您需要更改 _rec_name
:
class Ville(models.Model):
_name = 'obj.ville'
_rec_name = 'nom'
您可以按如下方式使用 _rec_name
:
酒店型号:
class obj_ghotel(osv.osv):
_name = "obj.ghotel"
_description = "Objet ghotel"
_rec_name = 'nom_hotel'
威乐 型号:
class obj_ville(osv.osv):
_name = "obj.ville"
_description = "Objet ville"
_rec_name = 'nom_ville'
您需要定义一个名为 name_get 的方法,如下所示
def name_get(self, cr, uid, ids, context=None):
if context is None:
context = {}
if isinstance(ids, (int, long)):
ids = [ids]
res = []
for record in self.browse(cr, uid, ids, context=context):
name = record.nom_ville
res.append((record.id, name))
return res