如何在Odoo 10中更新/删除上下文中的密钥?

如何在Odoo 10中更新/删除上下文中的密钥?,odoo,odoo-10,Odoo,Odoo 10,您好,我正在尝试从res.partner表单视图的上下文中删除键值 我使用controller功能打开partner form视图,并尝试将电话号码设置为默认号码,其工作正常。但是,当我试图通过单击创建按钮创建新客户时,电话号码再次自动填充。为了避免这种行为,在default\u get函数中,我将上下文复制到另一个变量中,使用del context['cc\u mobile']从上下文中删除键值。并重新分配给self.env.context。但当我尝试创建新客户时,删除的键值会再次出现在上下文

您好,我正在尝试从
res.partner
表单视图的上下文中删除键值

我使用
controller
功能打开
partner form视图
,并尝试将电话号码设置为默认号码,其工作正常。但是,当我试图通过单击创建按钮创建新客户时,
电话号码再次自动填充。为了避免这种行为,在
default\u get
函数中,我将上下文复制到另一个变量中,使用
del context['cc\u mobile']
从上下文中删除
键值。并重新分配给
self.env.context
。但当我尝试创建新客户时,删除的
键值会再次出现在上下文中

Controller.py

@http.route('/open_customer/<string:val>', type="http",method=['POST','GET'],website=False, auth="public")
def open_case_window(self,**kw):
    mobile_no = kw.get('val')
    action = request.env.ref('base.action_partner_form').sudo()
    mobile_flag = 0
    partner = 'res.partner'
    partner_model = request.env[partner]
    regex = re.match( '^(?:\01|02|03|04|06|07|09)\d*$', mobile_no)
    if regex:
        mobile_flag = 0
        partner_id = partner_model.search([('phone', '=', mobile_no)]).id
    else:
        mobile_flag = 1
        partner_id = partner_model.search([('mobile','=',mobile_no)]).id

    if partner_id:
        return werkzeug.utils.redirect('/web#id='+str(partner_id)+'&view_type=form&model='+partner)
    else:
        context = dict(action._context)
        if mobile_flag == 0:
            context.update({'cc_phone': mobile_no})
        else:
            context.update({'cc_mobile': mobile_no})
        context.pop('lang')
        url = werkzeug.utils.redirect('/web?debug=#view_type=form&model='+str(partner)+'&action=%s'%(action.id))
        return url
 @api.model
def default_get(self, fields):
    context = self.env.context.copy()
    print'default_get context',context
    res = super(Partner, self).default_get(fields)
    if 'cc_mobile' in context:
        res.update({'mobile':context.get('cc_mobile')})
    if 'cc_phone' in context:
        res.update({'phone':context.get('cc_phone')})
    if context.get('cc_mobile'):
        del context['cc_mobile']
    if context.get('cc_phone'):
        del context['cc_phone']
    self.env.context = context
    print'self.env.context after',self.env.context
    action = self.env.ref('base.action_partner_form').sudo()
    action.env.context = self.env.context
    return res

您不能从python端删除操作
上下文
键,因为它位于
客户端
端。当您在
manyOne
字段中调用服务器,如
search
create
fly中的记录时,您每次都会看到
context
卷土重来(Odoo的工作方式)

你需要的是一次性使用的东西,我认为你需要某种持久性,例如:

  • 包含
    用户id、模型名称、值、活动
    字段的虚拟模型,以便在控制器中为该特定用户的默认值创建记录

  • 通过使用
    user\u id
    model\u name
    字段搜索并隐藏该值或删除该值,覆盖
    default\u get
    来获取该值

  • 这样,当你点击创建按钮或在飞行中创建联系人时,当你搜索该值时,它将消失,因此不会再次使用

    这是一个简单的想法,易于实现,您需要处理一些情况,以防止用户保存两个默认值,如果发生一些中断应该不难

    编辑

    经过再三考虑,为了防止在创建记录时出现任何错误,只需在上下文中使用一个特殊的键传递它的ID,然后使用该ID检索它,然后使用它删除它。更简单、更安全,无需搜索