odoo many2one作为选择领域

时间:2018-03-03 17:27:39

标签: python odoo

我在odoo中创建了一个模块,我想使用many2one作为选择字段,问题在于城市的名称' ville en francais'下拉列表工作,它保存城市的ID(从数据库),但名称就像obj.ville,1(它显示模块的名称,id而不是数据库中城市的名称)

table output

enter image description here



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",
    }

4 个答案:

答案 0 :(得分:2)

您可以使用以下_rec_name

酒店型号:

class obj_ghotel(osv.osv):
    _name = "obj.ghotel"
    _description = "Objet ghotel"
    _rec_name = 'nom_hotel'

Ville 型号:

class obj_ville(osv.osv):
    _name = "obj.ville"
    _description = "Objet ville"
    _rec_name = 'nom_ville'

答案 1 :(得分:1)

这个问题是当odoo不知道如何表示记录时,他默认显示模型的名称和记录的id。

odoo如何知道如何表示记录,这是name_get中定义的models.py方法,首先他默认查找_rec_name的值是我假设的名字您在模型obj.ville中没有字段名称,请注意ulilisénom ^^。

因此您需要更改_rec_name

 class Ville(models.Model):
    _name = 'obj.ville'
    _rec_name = 'nom'

答案 2 :(得分:1)

您需要定义一个名为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

答案 3 :(得分:0)

默认情况下,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