【问题标题】:Attribute error in onchange methodonchange 方法中的属性错误
【发布时间】:2014-04-23 03:45:48
【问题描述】:

我有一个带有 onchange 方法的类,该方法从另一个模型中检索活动名称。当我运行它时,我收到这样的错误。

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

谁能告诉我为什么会发生这种情况以及我该如何解决它?

我的班级使用 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.'),
]

【问题讨论】:

    标签: python openerp onchange openerp-7


    【解决方案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 格式,以便您更清楚地了解它。

    On Change Method Tips

    希望这会对你有所帮助。

    【讨论】:

    • 我试过了,但仍然没有变化。我得到了同样的错误。
    • 你在这个wpb.wpb object,用'activity_id' : fields.many2one("budget.activity_year", "ID", type="char", size=64, ondelete="no action")换了吗?
    • 我无法将“activity_id”字段更改为与“budget.activity_year”相关,这就是我遇到的问题,它必须是budget.activity_summary。有没有办法在budget.activity_year 中检索活动名称而不更改'activity_id's many2one 关系?
    • 你在on_changebudget.activity_summary 中传递id,然后你尝试向self.pool.get('budget.activity_year') 获取价值。你需要做两件事,比如改变关系或改变self.pool.get('budget.activity_summary')。否则你会得到像Field activity_name not found in browse_record(budget.activity_year'这样的错误
    • 你是对的。我必须更改其中任何一个才能使其正常工作。我更改了 self.pool.get('budget.activity_summary') 并在 activity_summary 对象中创建了一个字段 'acitivity_name' 来获取名称。非常感谢您的帮助。
    【解决方案2】:

    更新您的 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 对象。

    【讨论】:

    • 它不起作用。我收到此错误:AttributeError: 'browse_record_list' 对象没有属性 'activity_name'。
    • 我必须将 'activity_code' 字段关系更改为 budget.activity_year 或 self.pool.get('budget.activity_year')self.pool.get('budget.activity_summary') 才能正常工作,无论如何感谢您的帮助,这对将来的参考很有用。
    【解决方案3】:

    名称的类型是记录列表,所以要浏览记录列表,必须定义元素。 在您的情况下,您可以键入: name[0].activity_name --> 用于 name 的第一条记录的 activity_name。 原谅我英语不好

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 2023-03-15
      • 2019-01-12
      • 2014-03-02
      • 2018-03-07
      • 2014-06-26
      • 2014-11-18
      • 2016-07-04
      相关资源
      最近更新 更多