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

时间:2019-08-21 11:01:55

标签: odoo odoo-10

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

我使用partner form view功能打开controller,并尝试将电话号码设置为默认电话,并且可以正常使用。但是,当我尝试通过单击创建按钮来创建新客户时,phone号会再次自动填写。为了避免这种行为,在default_get函数中,我将上下文复制到另一个变量中,并使用key value从上下文中删除了del context['cc_mobile']。并重新分配给self.env.context。但是,当我尝试创建新客户时,被删除的key value再次出现在上下文中。

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

ResPartner.py

 @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

1 个答案:

答案 0 :(得分:1)

您无法从python一侧删除key动作context,因为它位于client一侧。每当您在search字段中像many2one那样调用服务器,create实时记录时,每次都会看到此context重新出现(Odoo的工作方式)。 / p>

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

  1. 虚拟模型包含user_id, model_name, value, active字段,因此您可以在控制器中为该特定用户创建默认值的记录。

  2. 通过搜索default_getuser_id字段来覆盖model_name,从而
  3. 获取该值,并隐藏该值或删除

这样,当您点击创建按钮或在搜索值时快速创建联系人时,它将消失,因此不会再次使用。

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

修改

经过仔细考虑以防止在创建记录时出现任何错误,只需使用特殊键在上下文中传递其ID,然后使用That Id检索它,然后使用它然后将其删除。更轻松,更安全且无需搜索。