Estoy creando un módulo en odoo y quiero usar many2one como campo de selección, el problema está en el nombre de la ciudad 'ville en francais', el menú desplegable funciona y guarda la identificación de la ciudad (de la base de datos) pero name es como obj.ville, 1 (muestra el nombre del módulo, id en lugar del nombre de la ciudad en la base de datos)

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",
    }
1
Rad304 3 mar. 2018 a las 20:27

5 respuestas

La mejor respuesta

Puede usar _rec_name de la siguiente manera:

Modelo Hotel :

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

Modelo Ville :

class obj_ville(osv.osv):
    _name = "obj.ville"
    _description = "Objet ville"
    _rec_name = 'nom_ville'
2
Kenly 4 mar. 2018 a las 14:11

Este problema es cuando odoo no sabe cómo representar el registro, él le muestra por defecto el nombre del modelo y la identificación del registro.

Cómo sabemos cómo representar el registro, esto es don en el método name_get definido en models.py primero busca el valor de _rec_name por defecto es nombrar algunos, supongo que no no tiene un nombre de campo en el modelo obj.ville, je pense que t'as ulilisé nom ^^.

Entonces necesitas cambiar el _rec_name:

 class Ville(models.Model):
    _name = 'obj.ville'
    _rec_name = 'nom'
1
Charif DZ 4 mar. 2018 a las 11:36

Necesita definir un método llamado name_get como el siguiente

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
1
kerbrose 4 mar. 2018 a las 14:26

Many2one campos son por defecto tipos de campos de selección. Al principio, crea un modelo para ville con 'nombre' como atributo

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')

Después de eso, puede llamarlo en otro modelo como Many2one y aparecerá como campo de selección, pero no olvide crear una vista para el modelo.

PD: este código funciona en odoo 10

0
Joseph Florian 3 mar. 2018 a las 22:18

Mejor puede agregar opciones en XML no_open & no_edit.

0
Ajay Chauhan 4 mar. 2018 a las 10:09