【问题标题】:Odoo name_get working in editing onlyOdoo name_get 仅在编辑中工作
【发布时间】:2025-12-12 16:45:01
【问题描述】:

您好,我在 partner_view 的自定义 many2one 字段中覆盖 name_get,以根据上下文显示与 name 不同的字段

class partner_relation_role(osv.osv):

_name = "partner.relation.role"
_description = 'Types of relationships between contacts'

_columns = {
    'name': fields.char('Nome', size=128, required=True),
    'description': fields.text('Description'),
    'name_parent': fields.char('Parent name'),
    'name_child': fields.char('Child name'),
}

def name_get(self, cr, uid, ids, context=None):
    if context is None:
        context = {}

    res = []
    ret_name = ""

    for object in self.browse(cr, uid, ids, context = context):

        if object.name:
            if  context.get('parent_relation') is None:
                ret_name = object.name or ""
            elif context.get('parent_relation') is True:
                # returns relation name for parent relation
                ret_name = object.name_parent or object.name
            elif context.get('parent_relation') is False:
                ret_name = object.name_child or object.name

        res.append((object.id,ret_name))

    return res

并且在 res.partner 继承视图中:

<xpath expr="//page[@string='Contacts']" position="after">
                <page name="uprelations" string="Relationships">
                    <field name="uprelation_ids" nolabel="1" context="{'default_partner_id': active_id}">
                        <tree editable="bottom">
                            <field name="related_partner_id" options="{'no_create': True}"/>
                            <field name="role_id" options="{'no_create': True}" context="{'parent_relation' : True}"/>
                            <field name="influence"/>
                        </tree>
                    </field>
                </page>
                <page name="downrelations" string="Has relations from">
                    <field name="downrelation_ids" nolabel="1" context="{'default_related_partner_id': active_id}">
                        <tree editable="bottom">
                            <field name="partner_id" options="{'no_create': True}"/>
                            <field name="role_id" options="{'no_create': True}" context="{'parent_relation' : False}" />
                            <field name="influence"/>
                        </tree>
                    </field>
                </page>
            </xpath>

这在我编辑记录时有效。当我保存它时,显示的是“名称”,而不是其他字段值。

更新 根据有帮助的 Adrian Merrall 的说法,在视图中使用它时,我应该将上下文放在视图动作中:但在这种情况下,相同的动作会打开一个具有不同上下文的两个页面的视图(第 1 页,上下文变量 = TRUE,第 2 页具有相同的变量 = FALSE)。 我应该把这个上下文放在哪里?

更新2 我重新思考整个逻辑。我应该为每个页面使用不同的 fields.related 吗? 目的是关联联系人并显示“与”不同的关系(上行关系:A 是 B 的代理人,下行关系:B 由 A 代表;A 有 C 的顾问,C 是 A 的顾问)。每个关系都有两个对等点和两个对等点:向上关系开始的对等点是“主人”或“父母”,另一个是“奴隶”或“孩子”。 同一个联系人可以是某些关系的主人,而另一些关系的奴隶。

【问题讨论】:

    标签: openerp odoo


    【解决方案1】:

    从表面上看,您的代码看起来不错,但您当然需要检查您在上下文中得到的结果是否符合预期。如果这是一个视图,那么您需要在窗口操作中设置上下文。

    一个小问题是您对 ret_name 的重用。您将它初始化为一个空字符串,然后在循环中重新使用它。如果您的第一个对象记录有名称,则 ret_name 将更改为新值。任何没有名称的后续记录都不会使用空字符串,而是使用重新分配给 ret_name 的任何值。请记住,与 java 不同,python 没有循环范围。如果 parent_relation 在上下文中但具有 None、True 或 False 以外的值,也会发生同样的事情。

    最后,您应该在浏览器中将上下文声明为命名参数,并在循环中将浏览器调用为:

    for object in self.browse(cr, uid, ids, context = context):
    

    【讨论】:

    • 谢谢你——你给了我一些宝贵的提示,比如关于动作上下文的提示。我会检查他们。
    【解决方案2】:

    我解决了,代码没问题:我将上下文向上移动到页面。 结果视图是:

    <page name="downrelations" string="In relazione con">
                        <field name="downrelation_ids" nolabel="1" context="{'default_related_partner_id': active_id, 'parent_relation' : False}">
                            <tree string="Altri contatti in relazione" editable="bottom">
                                <field name="partner_id" options="{'no_create': True}"/>
                                <field name="role_id" options="{'no_create': True}" context="{'parent_relation' : False}" />
                                <field name="influence"/>
                            </tree>
                        </field>
                    </page>
    

    感谢阿德里安的提示。

    【讨论】: