新手常见开发问题总结分享(更新中)
-
最近开始学习OE,期间碰到不少问题和困难,经过高人指点或者自己研究已经解决,随着对产品的了解越来越深入,感觉OE确实是一个很好的开源ERP产品。
现将学习中遇到的一些问题(仅针对OE6.1),不管已经解决的还是没解决的,总结归纳如下:
一、上传附件后,中文文件名下载报错的问题
[b][color=green]解决办法[/color][/b]:在addons/web/controllers/main.py的Binary类的saveas和saveas_ajax方法中添加代码(返回response前):
if isinstance(filename, unicode): filename=filename.encode('utf8')
二、自定义模块中act_window中引用外部模块model报错的问题
[b][color=green]解决办法[/color][/b]:openerp__.py中要加入依赖的模块名称
三、如何改写系统原有对象关联的列表视图和表单视图?
比如添加我们自己的新模块,针对销售订单分别创建1个新的列表视图listview2和1个新的表单视图formview2。
现在针对销售订单至少有4个视图可以显示(系统销售模块原来定义了2个视图formview1,listview1),为了不影响原有视图显示,我们自己定义的两个视图的优先级设得比较低。
现在的基础上,自由地选择我们自己定义的2个视图呢?比如我们自己定义的act_window2要能显示自己定义的listview2和formview2,通过view_id属性可以优选一个listview2,但从列表视图跳到表单视图时就会回到之前的formview1,该如何指定formview2?
[b][color=green]解决办法[/color][/b]:同时添加ir.actions.act_window.view的定义,在ir.actions.act_window.view中指定view_id为listview2,而在加ir.actions.act_window中指定view_id为formview2。
四、表单视图(可编辑)和页面视图(只读)总是成对出现,如何控制只出现一个表单视图或一个页面视图呢?
补充说明:
我们常用的有tree和form两种视图,tree即是列表视图,form会包含可编辑的表单视图和只读的页面视图,这三种视图可通过页面右上角的工具栏进行切换。
我自己反复测试了,如果只设置为tree,则只会显示列表视图,工具栏不会显示。如果只设置为form,则仍然可显示表单视图和页面视图,可通过工具栏进行切换。
[b][color=red]该问题未解决[/color][/b]。
五、在ir.ui.view类型对象中使用inherit_id元素对视图进行继承时,发现没有生成新的视图,而只是修改了原来的系统视图。有时候系统视图内容多且复杂,在不想重新定义视图的前提下,有什么办法继承一个新的视图但不改变原来的系统视图吗?
补充说明:
假如我想在自己的测试模块中参考销售订单的视图,可以按下面这样基于系统视图进行继承和修改:
<record id="view_order_form1" model="ir.ui.view">
<field name="name">sale.order.form1</field>
<field name="model">sale.order</field>
<field name="type">form</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<data>
<button name="order_confirm" position="after">
<button name="order_test" string="测试" icon="gtk-apply"/>
</button>
</data>
</field>
</record>
但结果发现系统原来的销售订单界面也被修改了,而我期望的效果是我继承添加的这个视图只需要给我自己模块用就可以了。
[b][color=red]该问题未解决[/color][/b]。
六、发现界面上某些信息仍是中文,虽然po文件已经给出了中文翻译,但这些翻译始终不生效。
[b][color=green]解决办法[/color][/b]:经检查发现有两种原因。第一种情况是action的help信息未翻译,原因是自己模块中定义了相同name的action,修改name即可;第二种情况是代码中的字符串常量未翻译,原因是_()处理函数中的lang变量取不到正确的语言,具体原因没有细查,考虑到不需要显示其它语言,我加了一句if not lang: lang = u'zh_CN'即可。 -
楼主,请教你一个问题。对context这个字典理解吗?
在sale.order.line的中
for this in self.browse(cr,uid,ids,context=context)
context['pricelist']=this.order_id.pricelist_id.id //这句话什么意思 -
楼主,请指教。context能说得详细点吗。context[]的作用,什么叫上下文信息。context到底是做什么的?
-
@fanzhang1990
context-上下文,顾名思义就是在客户端操作过程中的关联信息,其本身是一个字典。比如当你在一个列表中选择了多条记录,系统就会将你所选择的记录id放到 context中:context['active_ids'] =[所选记录ids]
当然在程序中我们也可以人为将关联信息放到contex中,这样在server端就可以根据context中的值做相应的处理,
比如:
创建订单时,每个客户可能有自己对应的pricelist,在订单行上选择产品时需要根据对应的pricelist来列示价格信息。这个时候我们就可以把当前选择客户的id,或其对应的pricelist id放在订单行的产品字段上的context,而当选择产品时所激发并调用 onchange函数时将此context传递给它,这样我们就能做相应的价格计算了。
context还可以被用来定义默认值等,用法很丰富,还是多看代码来了解 -
多谢指教
-
另外,假如我想在自己的测试模块中参考销售订单的视图,可以按下面这样基于系统视图进行继承和修改:
<record id="[color=orange]view_order_form1[/color]" model="ir.ui.view">
<field name="name">sale.order.form1</field>
<field name="model">sale.order</field>
<field name="type">form</field>
<field name="inherit_id" ref="[color=orange]sale.view_order_form[/color]"/>
<field name="arch" type="xml">
<data>
<button name="order_confirm" position="after">
<button name="order_test" string="测试" icon="gtk-apply"/>
</button>
</data>
</field>
</record>
但结果发现系统原来的销售订单界面也被修改了,而我期望的效果是我继承添加的这个视图只需要给我自己模块用就可以了。