onchange方法中的属性错误
我有一个类里面有一个叫做 onchange 的方法,这个方法是用来从另一个模型中获取活动名称的。当我运行这个方法时,出现了一个错误,内容是这样的:
AttributeError: 'Field activity_name not found in browse_record(budget.activity_year, 16)'
有人能告诉我为什么会出现这个错误吗?我该怎么解决呢?
这是我带有 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':{}}
这是对应的 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>
这是我试图获取活动名称字段的类:
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.'),
]
3 个回答
0
名字的类型是一个记录的列表,所以要查看这个记录列表,你必须先定义这个元素。
在你的情况下,你可以这样写:name[0].activity_name --> 这是获取名字列表中第一个记录的活动名称。
抱歉我的英语不好。
1
更新你的 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 文件
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
字段的值是从 budget.activity_year 对象中获取的。
1
你的 activity_id
和 budget.activity_summary
有关系,而你从 budget.activity_year
中获取值。我觉得这可能和 budget.activity_year
也有关系。试着改变一下这个关系,然后用下面的 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}
另外,请看看其他 on_change
的格式,这样你会更清楚它是怎么回事。
希望这能帮到你。