如何从 Odoo 10 的上下文中更新/删除密钥?
How to update/ delete a key from a context in Odoo 10?
您好,我正在尝试从 res.partner
表单视图的上下文中删除键值。
我使用 controller
函数打开 partner form view
并尝试将 phone 号码设置为默认号码并且它工作正常。但是当我尝试通过单击创建按钮创建新客户时,phone
数字再次自动填充。为了避免这种行为,在 default_get
函数中,我将上下文复制到另一个变量中,使用 del context['cc_mobile']
从上下文中删除了 key value
。并重新分配给 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( '^(?:|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
您不能从 python 端删除 key
操作 context
,因为它在 client
端。每当您在 many2one
字段中调用服务器,如 search
,create
一条记录时,您每次都会再次看到此 context
卷土重来(Odoo 的工作方式)。
你需要的是一次性使用的东西,我觉得你需要某种坚持例如:
包含 user_id, model_name, value, active
字段的虚拟模型,因此在控制器中为该特定用户创建默认值记录。
通过使用 user_id
和 model_name
字段搜索覆盖 default_get
来获取该值,并 隐藏 该值或删除它。
这样,当您点击创建按钮或在飞行中创建联系人时,当您搜索该值时,它将消失,因此不会被第二次使用。
这是一个简单且易于实现的想法,您需要处理一些情况以防止用户在发生某些中断时保存两个默认值应该不难。
编辑
在创建记录时再次考虑防止任何错误,只需在上下文中使用特殊键传递它的 ID,然后使用该 ID 检索它,使用它然后删除它。更简单,更安全,无需搜索。
您好,我正在尝试从 res.partner
表单视图的上下文中删除键值。
我使用 controller
函数打开 partner form view
并尝试将 phone 号码设置为默认号码并且它工作正常。但是当我尝试通过单击创建按钮创建新客户时,phone
数字再次自动填充。为了避免这种行为,在 default_get
函数中,我将上下文复制到另一个变量中,使用 del context['cc_mobile']
从上下文中删除了 key value
。并重新分配给 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( '^(?:|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
您不能从 python 端删除 key
操作 context
,因为它在 client
端。每当您在 many2one
字段中调用服务器,如 search
,create
一条记录时,您每次都会再次看到此 context
卷土重来(Odoo 的工作方式)。
你需要的是一次性使用的东西,我觉得你需要某种坚持例如:
包含
user_id, model_name, value, active
字段的虚拟模型,因此在控制器中为该特定用户创建默认值记录。通过使用
user_id
和model_name
字段搜索覆盖default_get
来获取该值,并 隐藏 该值或删除它。
这样,当您点击创建按钮或在飞行中创建联系人时,当您搜索该值时,它将消失,因此不会被第二次使用。
这是一个简单且易于实现的想法,您需要处理一些情况以防止用户在发生某些中断时保存两个默认值应该不难。
编辑
在创建记录时再次考虑防止任何错误,只需在上下文中使用特殊键传递它的 ID,然后使用该 ID 检索它,使用它然后删除它。更简单,更安全,无需搜索。