Odoo View视图默认是不认识attrs中的uid的,其原因在于后台将xml转化为html的过程中对attrs调用了python的eval方法,而对于eval函数来说,我们传入的形如[('user.id','=',uid)]中的uid是没有声明的变量,因此,日志的报错信息才会为"name 'xxx' is not defined".

    有时候我们确实希望attrs能够认识我们的uid,以方便我们动态地控制view中页面的显示内容。虽然我们也可以通过其他的方式,例如,field_view_get方法的重载,来曲线地达到我们的目的,但这样的方法不仅繁琐复杂,而且不具有普遍的适应性。而假如我们通过某种方式让Odoo认识了attrs中的uid那么不仅我们可以将之用到button上,也可以用到field,page上,要比field_view_get方法灵活的多。

  那么,究竟如何才能让odoo认识attrs中的uid呢?

    我们首先要来了解xml中的attrs是如何被识别转化html的。Odoo中的xml都是通过ir.ui.view对象进行处理后,解析为前端页面展示出来。在ir.ui.view对象中有一个postprocess方法用来处理诸如xml中节点的显示,group限制等等功能,在该方法里内嵌了一个处理node的transfer_node_to_modifiers方法,该方法定义在orm中,而我们要实现我们的目的就是要通过重载这个方法来实现。

    

def transfer_node_to_modifiers(node, modifiers, context=None, in_tree_view=False):
if node.get('attrs'):
modifiers.update(eval(node.get('attrs'))) if node.get('states'):
if 'invisible' in modifiers and isinstance(modifiers['invisible'], list):
# TODO combine with AND or OR, use implicit AND for now.
modifiers['invisible'].append(('state', 'not in', node.get('states').split(',')))
else:
modifiers['invisible'] = [('state', 'not in', node.get('states').split(','))] for a in ('invisible', 'readonly', 'required'):
if node.get(a):
v = bool(eval(node.get(a), {'context': context or {}}))
if in_tree_view and a == 'invisible':
# Invisible in a tree view has a specific meaning, make it a
# new key in the modifiers attribute.
modifiers['tree_invisible'] = v
elif v or (a not in modifiers or not isinstance(modifiers[a], list)):
# Don't set the attribute to False if a dynamic value was
# provided (i.e. a domain from attrs or states).
modifiers[a] = v

  从上面的方法中,我们可以加入对uid的处理,如果发现attrs中有uid,就将之替换为我们当前登录用户的id:

if 'uid' in  node.get('attrs'):
uid = 1#为啥是1,这是个秘密

  这样我们就能在xml中从容地将uid用作我们的判断条件了。

    等等,为啥上面的代码中uid=1?如何在orm文件中获取到当前登录用户的id呢?读者不如自己思考一下(其实我是给伸手党们挖了个坑)。

实在想不出来的同学可以联系我索取答案:mail:kfx2007@163.com (付费阅读500RMB,支付宝账号同邮箱)

最新文章

  1. java数组对象的浅层复制与深层复制
  2. druid数据库密码加密程序编写
  3. Maven仓库
  4. 详解rsync算法--如何减少同步文件时的网络传输量
  5. MySQL~ IN , FIND_IN_SET , LIKE
  6. 关于工作流之最后Assign给TeamLeader
  7. PHP - php汉字转拼音
  8. 快速幂模m算法
  9. linux之SQL语句简明教程---GROUP BY
  10. 【转】页面尺寸不一样的PDF页面调整方法
  11. vue1升级到vue2的问题
  12. c#实现list,dataset,DataTable转换成josn等各种转换方法总和
  13. android四大组件学习总结以及各个组件示例(1)
  14. [转载] Java学习之Hessian通信基础
  15. [poj2342]Anniversary party_树形dp
  16. react-redux简单的记事本应用
  17. nginx 阻止非自己域名解析到服务器
  18. solr中facet及facet.pivot理解(整合两篇文章保留参考)
  19. ORACLE 存储函数
  20. easyui的datagrid和treegrid的使用

热门文章

  1. Android屏幕适配全攻略(最权威的官方适配指导) (转)
  2. BurpSuite拦截HTTPS请求
  3. Angular.js 以及个人学习网站
  4. Android学习系列(42)--Android Studio实战技巧
  5. 移动端网页 -- 安卓与IOS兼容
  6. angularjs指令(二)
  7. 2014-2015 ACM-ICPC, NEERC, Moscow Subregional Contest E. Equal Digits
  8. MySQL设置当前时间为默认值的方法
  9. Android NumberPicker 修改分割线颜色和高度及字体颜色大小
  10. TC SRM 593 DIV2 1000