简体   繁体   English

onchange方法中的属性错误

[英]Attribute error in onchange method

I have a class with an onchange method which retrieves the activity name from another model. 我有一个带有onchange方法的类,它从另一个模型中检索活动名称。 when I run it, im getting an error like this. 当我运行它时,我得到这样的错误。

AttributeError: 'Field activity_name not found in browse_record(budget.activity_year, 16)' AttributeError:'在browse_record中找不到字段activity_name(budget.activity_year,16)'

Can anyone tell why this is happening and how may i fix it? 任何人都可以告诉为什么会发生这种情况,我该如何解决?

My class with onchange method 我的班级用onchange方法

class wpb(osv.osv):
_name = "wpb.wpb"
_description = "Work Program and Budget"
_columns = {
    'activity_id' : fields.many2one("budget.activity_summary", "ID", type="char", size=64, ondelete="no action"),
    'activity_name' : fields.char("Activity Name", type="char", size=64, ondelete="no action" ),
    'region_id' : fields.related("activity_code", "region_id", type="char", string="Management Unit"),
    'service_lvl' : fields.float("Service Level", digits=(4,2)),
    'annual_work' : fields.float("Annual Work", digits=(4,2)),
       }

def onchange_activity_code(self, cr, uid, ids, activity_id, context = None):
    if activity_id:
         names = self.pool.get('budget.activity_year').browse(cr, uid, activity_id, context=context)
    return {'value': {'activity_name': names.activity_name }}
    return {'value':{}}

The xml view xml视图

 <record id="wpb_form" model="ir.ui.view">
        <field name="name">wpb.wpb.form</field>
        <field name="model">wpb.wpb</field>
        <field name="arch" type="xml">
            <form string="Work Program and Budget" version="7.0">
                <group col="2">
                    <field name="activity_id" on_change="onchange_activity_code(activity_id)"/>
                    <field name="activity_name"/>
                    <field name="region_id" readonly="1"/>
                    <field name="service_lvl"/>
                    <field name="annual_work"/>
                </group>
            </form>
        </field>
    </record>


<record id="wpb_view" model="ir.ui.view">
        <field name="name">wpb.wpb.view</field>
        <field name="model">wpb.wpb</field>
        <field name="type">tree</field>
        <field name="arch" type="xml">
            <tree string="Work Program and Budget" editable="top">
                <field name="activity_id" on_change="onchange_activity_code(activity_id)"/>
                <field name="activity_name"/>
                <field name="region_id" readonly="1"/>
                <field name="annual_work"/>
            </tree>
        </field>
    </record>

The class im trying to get the activity name field 该类我试图获取活动名称字段

class activity_year(osv.osv):
_name = "budget.activity_year"
_description = "Activity year"
_rec_name = "activity_yearcode"
_columns = {
    'activity_yearcode' : fields.char("Activity Code", size=64, required=True),
    'activity_name' : fields.char("Activity Name", size=128),
    'act_status' : fields.selection([
                ('1', 'All'),
                ('2', 'Active'),
                ('3', 'Inactive'),
                ], 'Status'),
    }
_sql_constraints = [
    ('activity_yearcode_unique', 'UNIQUE(activity_yearcode)', 'Each activity code is unique.'),
]

Your activity_id is relationship with budget.activity_summary and you get value from budget.activity_year . 您的activity_idbudget.activity_summary有关系,您可以从budget.activity_year获取价值。 I think that might be relationship with budget.activity_year . 我认为这可能与budget.activity_year有关系。 Change this relationship and try below on_change method. 更改此关系并尝试下面的on_change方法。

try this on_change 试试这个on_change

def onchange_activity_code(self, cr, uid, ids, activity_id, context = None):
    res = {}
    names = self.pool.get('budget.activity_summary').browse(cr, uid, activity_id, context=context)
    if names:
        res['activity_name'] = names.activity_name
    return {'value': res}

And please see other on_change format so you will get more clear idea about it. 请参阅其他on_change格式,以便您更清楚地了解它。

On Change Method Tips 关于改变方法提示

Hope this will help you. 希望这会帮助你。

Update your onchange method 更新您的onchange方法

def onchange_activity_code(self, cr, uid, ids, activity_id, context = None):
    if activity_id:
         names = self.pool.get('budget.activity_year').browse(cr, uid, [activity_id], context=context)
         return {'value': {'activity_name': names.activity_name }}

.py file .py文件

from openerp.osv import fields, osv

class activity_year(osv.osv):
    _name = "budget.activity_year"
    _description = "Activity year"
    _rec_name = "activity_yearcode"
    _columns = {
        'activity_yearcode' : fields.char("Activity Code", size=64, required=True),
        'activity_name' : fields.char("Activity Name", size=128),
        'act_status' : fields.selection([
                    ('1', 'All'),
                    ('2', 'Active'),
                    ('3', 'Inactive'),
                    ], 'Status'),
        }
    _sql_constraints = [
        ('activity_yearcode_unique', 'UNIQUE(activity_yearcode)', 'Each activity code is unique.')
     ]

class wpb(osv.osv):
    _name = "wpb.wpb"
    _description = "Work Program and Budget"
    _columns = {
        'activity_id' : fields.many2one("budget.activity_summary", "ID", type="char", size=64, ondelete="no action"),
        'activity_name' : fields.char("Activity Name", type="char", size=64, ondelete="no action" ),
        'region_id' : fields.related("activity_code", "region_id", type="char", string="Management Unit"),
        'service_lvl' : fields.float("Service Level", digits=(4,2)),
        'annual_work' : fields.float("Annual Work", digits=(4,2)),
    }

    def onchange_activity_code(self, cr, uid, ids, activity_id, context = None):
        if activity_id:
             names = self.pool.get('budget.activity_year').browse(cr, uid, [activity_id], context=context)
             return {'value': {'activity_name': names.activity_name }}

activity_name field set value from budget.activity_year object. activity_name字段设置来自budget.activity_year对象的值。

The type of name is list of records, so for browse the list of records, you must define the element. 名称的类型是记录列表,因此要浏览记录列表,必须定义元素。 In your case, you can type : name[0].activity_name --> for the activity_name of the first record of name. 在您的情况下,您可以键入:name [0] .activity_name - >作为第一个名称记录的activity_name。 Forgive me for my bad english 原谅我的英语不好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM