Как изменить отображаемое значение из поля many2one в OpenERP (Odoo)?

Я создаю новый модуль в Odoo (OpenERP), но не могу правильно использовать поле.

(http://i.stack.imgur.com/pKQpT.png)

Я могу выбрать поле из другого класса (определенного в том же модуле), но мне нужно изменить отображаемое значение.

В этом примере у меня есть строка «menu, 2» для поля piatto. Эта строка получена из класса ordini с полем many2one, но я хочу отобразить поле с именем nome (показано на следующем изображении ).

(http://i.stack.imgur.com/nQwRL.png)

Это файл Python.

class menu(osv.Model):
_name = "menu"
_description = "Menu"
_order = "tipo"
_columns = {
    'nome': fields.char('Nome', size=80, required=True),
    'tipo': fields.selection([
                ('antipasto', 'antipasto'),
                ('primo', 'primo piatto'),
                ('secondo', 'secondo piatto'),
                ('contorno', 'contorno'),
                ('dolce', 'dolce')
                ], 'Tipo di piatto'),
    'prezzo': fields.float('Prezzo', digits=(10,2), required=True),
    'ingredienti': fields.text('Lista ingredienti'),
    'immagine': fields.binary('Immagine'),
}
_sql_constraints = [('unique_name', 'unique(nome)', 'Il piatto è già presente.')]

class ordini(osv.Model):
_name = "ordini"
_description = "Ordini"
_columns = {
    'dipendente': fields.many2one('hr.employee', 'Dipendente', ondelete='set null', required=True),
    'dettagli_ids': fields.one2many('ordini.dettagli', 'n_ordine', 'Ordine'), 
}

class ordini_dettagli(osv.Model):        
_name = "ordini.dettagli"
_description = "Dettagli ordine"
_columns = {
    'n_ordine': fields.integer('Ordine', readonly=True),
    'piatto': fields.many2one('menu', 'Piatto'),
    'qta': fields.integer('Quantità'),
    'prezzo_piatto': fields.related('piatto','prezzo',type='float',string='Prezzo',readonly=True),
}
_defaults = {
     'qta': 1,
}

ИЗМЕНИТЬ Мне также нужно обновить поле prezzo, когда я выбираю запись piatto.

Спасибо.


person vencizon    schedule 21.10.2014    source источник


Ответы (1)


Вам необходимо объявить, какое поле используется для имени объекта, используя _rec_name атрибут. В твоем случае:

class menu(osv.Model):
    _name = "menu"
    _description = "Menu"
    _order = "tipo"
    _rec_name = 'nome'

    # ...

В качестве альтернативы вы можете просто переименовать nome в name, поскольку name является значением по умолчанию для _rec_name.

person Ludwik Trammer    schedule 21.10.2014
comment
Спасибо! Работает нормально. Я добавил еще одну просьбу в пост, если вы снова можете мне помочь. ;) - person vencizon; 21.10.2014
comment
Вы также можете перезаписать name_get и использовать контекст, чтобы он отображал определенное значение для вашей формы, но значение по умолчанию для других форм, если вы этого хотите. Однако, если вы начинаете использовать name_get или _rec_name, вам всегда следует рассмотреть возможность переопределения name_get и name_search. - person Adrian Merrall; 22.10.2014
comment
@AdrianMerrall "if you are starting to use name_get or _rec_name, you should always consider overriding name_get and name_search as well". Почему ты так говоришь? Я понимаю, почему изменение name_get должно в большинстве случаев также означать изменение name_search соответственно. Но реализация обоих этих методов по умолчанию уже использует _rec_name, поэтому, если вы просто измените значение этого свойства, не меняя ничего другого, я думаю, у вас все будет хорошо. - person Ludwik Trammer; 22.10.2014
comment
@LudwikTrammer Хорошо заметили - совершенно верно. Если вы устанавливаете только _rec_name, вы будете в порядке с name_search по умолчанию, просто если вы переопределите name_get, вам может потребоваться выполнить name_search. - person Adrian Merrall; 23.10.2014