Odoo name_get仅用于编辑

时间:2015-02-27 17:59:56

标签: openerp odoo

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

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>

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

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

UPDATE2 我重新思考整个逻辑。我应该为每个页面使用不同的field.related吗? 目的是联系联系人并展示不同的关系&#34;对比&#34; (上调:A是B的律师,下行:B由A代表; A有C的咨询,C是A的顾问)。每个关系都有两个对等,两个对等关系:从上升开始的对等方是&#34; master&#34;或&#34;父母&#34;,另一个是&#34;奴隶&#34;或者&#34;孩子&#34;。 对于某些关系,同一个联系人可以掌握,对其他人则可以是奴隶。

2 个答案:

答案 0 :(得分:1)

从表面上看,您的代码看起来还不错,但当然您需要检查您是否在上下文中获得了所期望的内容。如果这是一个视图,那么您需要在窗口操作中设置上下文。

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

最后,你应该在浏览中将context声明为一个命名参数,然后在循环中调用browse:

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

答案 1 :(得分:0)

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

<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>

感谢Adrian的提示。