2015-04-02 3 views
0

Я определил эти классы:OnChange метод не работает (не отображается никакой ошибки) odoo

class brand(osv.osv): 
    _name = "cm.brand" 
    _columns = { 
     'name': fields.char('Marca', size=30) 
     } 

class model(osv.osv): 
    _name = "cm.model" 
    _columns = { 
     'name': fields.char('Modelo', size=30) 
     } 

class cm_application_data_line(osv.osv): 
     _name = "cm.application.data.line" 
     _columns = { 
     'comun_denominador_id': fields.many2one('comun.denominador', 'Comun denominador', required=True, ondelete='cascade'), 
     'brand': fields.many2one('cm.brand', 'Marca', required=True, ondelete='restrict'), 
     'date_beg': fields.selection([(num, str(num)) for num in range(1980, (datetime.now().year)+1)], 'Año inicial'), 
     'dateend': fields.selection([(num, str(num)) for num in range(1980, (datetime.now().year)+1)], 'Año final'), 
     'model': fields.many2one('cm.model', 'Modelo', required=True, ondelete='restrict') 
     } 

Я сделал это, чтобы получить вид страницы на моем «comun.denominador» новой модели:

class comun_denominador(osv.osv): 
    _name='comun.denominador' 
    _rec_name='comun_denominador' 
    _columns = {  
     'comun_denominador': fields.char('Común denominador', size=10), 
     'application_data_comun_denominador_ids': fields.one2many('cm.application.data.line', 'comun_denominador_id', 'Datos de aplicación del común denominador') 

     } 
вид

И XML:

<notebook> 
    <page string="Datos de aplicación"> 
     <field name="application_data_comun_denominador_ids" widget="one2many_list" context="{'show_attribute': False}"> 
      <tree string="Aplicación" editable="bottom"> 
       <field name="brand" /> 
       <field name="model" /> 
       <field name="date_beg"/> 
       <field name="dateend"/> 
      </tree> 
     </field> 
    </page> 
</notebook> 

до сих пор все в порядке. Теперь в представлении формы product.template я добавил точно такую ​​же страницу в виде формы и добавил поле cm_id, ссылающееся на модель «comun.denominador», так что, когда пользователи выбирают «cm_id», метод on_change выводит все значения со страницы в 'comun.denominador' на мою новую страницу в 'product.template':

XML образца в product.template:

<xpath expr="//field[@name='sale_ok']" position="after"> 
    <separator colspan="2" string="Común denominador"/> 
     <field name="cm_id" on_change="on_change_cm_id(cm_id)"/> 
</xpath> 
<xpath expr="//page[@string='Sales']" position="after"> 
    <page string="Datos de aplicación"> 
     <field name="application_data_product_template_ids" widget="one2many_list" context="{'show_attribute': False}"> 
      <tree string="Aplicación" editable="bottom"> 
       <field name="brand" /> 
       <field name="model" /> 
       <field name="date_beg"/> 
       <field name="dateend"/> 
      </tree> 
     </field> 
     </page> 
</xpath> 

Новый класс и product.template наследование:

class product_template_application_data_line(osv.osv): 
    _name = "product.template.application.data.line" 
    _rec_name = 'brand' 
    _columns = { 
     'product_template_id': fields.many2one('product.template', 'Product template', required=True, ondelete='cascade'), 
     'brand': fields.many2one('cm.brand', 'Marca', required=True, ondelete='restrict'), 
     'date_beg': fields.selection([(num, str(num)) for num in range(1980, (datetime.now().year)+1)], 'Año inicial'), 
     'dateend': fields.selection([(num, str(num)) for num in range(1980, (datetime.now().year)+1)], 'Año final'), 
     'model': fields.many2one('cm.model', 'Modelo', required=True, ondelete='restrict') 

    } 


class comun_denominador_product_template(osv.osv): 
    _inherit = 'product.template' 
    _name='product.template' 
    def on_change_cm_id(self,cr, uid, ids,cm_id,context=None): 
     context=context or {} 
     application_data_product_template = [] 
     dict = {} 
     if ids: 
     application_ids = self.pool.get('product.template.application.data.line').search(cr, uid,[('product_template_id','in',ids)]) 
     self.pool.get('product.template.application.data.line').unlink(cr, uid, application_ids) 
     application_cm_ids = [] 
     application_cm_ids = self.pool.get('cm.application.data.line').search(cr, uid, [('comun_denominador_id', '=', cm_id)]) 
     for application_id in self.pool.get('cm.application.data.line').read(cr, uid, application_cm_ids, ['brand', 'date_beg', 'dateend', 'model']): 
      application_data_product_template.append((0,0,{'brand':application_id['brand'][0],'date_beg':application_id['date_beg'], 'dateend':application_id['dateend'], 'model':application_id['model'][0]})) 
     dict.update(application_date_product_template_ids= 
        application_data_product_template)    
     return {'dict':dict} 
_columns = { 
    'cm_id' : fields.many2one('comun.denominador','Común denominador', select=True, ondelete='cascade'), 
    'application_data_product_template_ids': fields.one2many('product.template.application.data.line', 'product_template_id', 'Datos de aplicación de la tabla de producto') 
     } 

Когда я выбираю cm_id, я не вижу журнала ошибок, более того, настройка отладчика my on_ функция изменения возвращает такой сигнал:

dict: {'application_data_product_template_ids': [(0, 0, {'brand': 2, 'date_beg': 1995, 'dateend': 2009, 'model': 5}), (0, 0, {'brand': 1, 'date_beg': 1995, 'dateend': 2006, 'model': 2})]} 

Что представляется правильным.

Однако мои значения на странице product.template не загружаются.

Пожалуйста, некоторые предложения!

ответ

1

Согласно документации, данных OpenERP определение on_change функции должно быть как:

def name_change(self, cr, uid, ids, name, address, city, context=None): 
    ... 
    return { 
     'value': { 
      'address': ... 
      'city': ... 
     } 
    } 

Здесь, в свою очередь, 'value' главный ключ и в вашем случае 'dict' является основным ключом, так вот почему ваш on_change не работает.

Посмотрите на странице this для более подробной информации.

Надеюсь, это поможет.

+0

Спасибо, это работает! –

Смежные вопросы