onchange方法不工作(没有显示错误)odoo

时间:2015-04-02 16:22:18

标签: python 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表单视图中,我在表单视图中添加了完全相同的页面,并添加了一个字段&#39; cm_id&#39;提及&#39; comun.denominador&#39;模型,以便当用户选择“cm_id”时,on_change方法会在“comun.denominador”中提供来自页面的所有值。到我的新产品&quot; product.template&#39;:

product.template中的XML示例:

<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时,我看不到错误日志,更重要的是,设置调试器我的on_change函数返回一个这样的字典:

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 个答案:

答案 0 :(得分: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页面了解更多详情。

希望它有所帮助。