我有一个One2many字段,该字段显示的树视图具有其协同模型的最高优先级。实际上,我想显示该树视图,但是禁用了创建模式(以避免用户添加项目)。
所以我想知道是否有任何方法可以在不调用整个树形视图副本的情况下仅将属性create="false"
添加到tree
标签中。
我认为仅向ir_ui_view
添加另一条记录有点重复,而且功能不强。
有人使用更好的方法吗?
编辑
由于每个答案都提出相同的建议,因此我正在对此进行更清晰的编辑。以下代码不是我的问题的解决方案:
<field name="one2many_field">
<tree create="false">
<field name="field_x"/>
<field name="field_y"/>
...
</tree>
</field>
在这种情况下,我必须将现有树视图的所有字段复制到tree
标记中。我试图避免这种情况有几个原因:
depends
的{{1}}参数,使其包含所有插入这些字段的模块。但是,我的模块完全不依赖那些模块,我只需要复制树形视图即可。__manifest__.py
的视图)中。所以我问是否有人知道一种使用现有视图的方法(而不是将其字段粘贴在create="false"
标签内)但禁用其 Create 选项。
答案 0 :(得分:3)
有趣的问题。我实际上不知道是否可以这样做,但是可以结合使用tree_view_ref
,视图mode
和priority
来实现。
我创建了两个简单的插件(custom_sale
和test_addon
)进行测试。第一个只是将新字段添加到sale.order
树视图之一。我这样做是为了确保其他模块也在One2many
中也显示新字段。
sale_order.py
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
dummy_field = fields.Char(String="Dummy")
sale_order_views.xml
<odoo>
<record id="view_quotation_tree_inherit" model="ir.ui.view">
<field name="name">view_quotation_tree_inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_quotation_tree"/>
<field name="arch" type="xml">
<field name="state" position="after">
<field name="dummy_field"/>
</field>
</field>
</record>
</odoo>
dummy_model.py
from odoo import fields, models
class Dummy(models.Model):
_name = 'dummy.model'
name = fields.Char()
order_ids = fields.One2many(
comodel_name='sale.order',
inverse_name='dummy_id'
)
sale_order.py
from odoo import fields, models
class Order(models.Model):
_inherit = 'sale.order'
dummy_id = fields.Many2one(comodel_name='dummy.model')
到目前为止,还没有幻想。所有的魔术都发生在视图上。首先,我们必须继承One2many
字段所指向的模型的树视图:在我的情况下,sale.order
。我们必须确保新视图的mode
为primary
。并且我们设置了足够高的优先级,以确保由我们不依赖的其他模块添加的字段也出现在我们的视图中(我认为优先级可以高达9999,但不确定)。当然,我们还将create="false"
属性添加到tree
节点。
sale_order_views.xml
<odoo>
<record id="view_quotation_tree_inherit" model="ir.ui.view">
<field name="name">view_quotation_tree_inherit</field>
<field name="model">sale.order</field>
<field name="mode">primary</field>
<field name="priority" eval="500"/>
<field name="inherit_id" ref="sale.view_quotation_tree"/>
<field name="arch" type="xml">
<tree position="attributes">
<attribute name="create">0</attribute>
</tree>
</field>
</record>
</odoo>
并且,在dummy.model
表单视图上,当我们声明order_ids
字段时,我们必须使用tree_view_ref
键通过上下文传递我们的视图(您可能还想检查{{ 1}})。我还添加了一个简单的操作和一些菜单项,以便可以测试所有内容。
dummy_model_views.xml
form_view_ref
请注意,在我的 <record id="dummy_view_tree" model="ir.ui.view">
<field name="name">dummy_view_tree</field>
<field name="model">dummy.model</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
</tree>
</field>
</record>
<record id="dummy_view_form" model="ir.ui.view">
<field name="name">dummy_view_form</field>
<field name="model">dummy.model</field>
<field name="arch" type="xml">
<form>
<group>
<field name="name"/>
</group>
<field name="order_ids"
context="{'tree_view_ref': 'test_addon.view_quotation_tree_inherit'}"/>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_dummy_tree">
<field name="name">Dummy List</field>
<field name="res_model">dummy.model</field>
<field name="view_mode">tree,form</field>
<field name="context">{}</field>
</record>
<menuitem name="Dummy" id="menu_dummy" sequence="70"/>
<menuitem name="Dummy List" id="menu_dummy_list" sequence="5" parent="menu_dummy" action="action_dummy_tree"/>
</odoo>
中,我没有任何方法可以填充O2m字段(我想您是通过编程方式进行的,或者它们是以其他方式创建的),因此我启用和禁用了创建在树状视图上单击以创建一些记录并测试是否能够编辑和删除它们。顺便说一句,我很确定这也适用于test_addon
字段。
希望有帮助。
答案 1 :(得分:0)
create="false"
标签上的<tree>
属性可以解决问题,所以为什么不继承视图并更改<tree>
标签的属性。
<template id="your_view_id" inherit_id="some_module.some_view_id" name="Your View" priority="50">
<xpath expr="//tree" position="attributes">
<attribute name="create" eval="False"/>
</xpath>
</template>
以下示例将显示一个树视图,在该树视图上,一对多关系是只读的
<field name="one_to_many_field_ids">
<tree create="false">
<field name="name"/>
</tree>
</field>
答案 2 :(得分:0)
readonly="1"
属性应用于One2many字段。
它在view_move_form
上的视图<path_to_v12>/addons/stock/views/stock_move_views.xml
上使用,如下所示:
<field name="move_orig_ids" string="Origin Moves" readonly="1">
<tree>
<field name="location_id"/>
<field name="location_dest_id"/>
<field name="product_uom_qty"/>
<field name="product_uom"/>
<field name="state"/>
</tree>
</field>
因此,也许<field name="one2many_field_ids" readonly="1"/>
就足够了。
答案 3 :(得分:0)
尝试一下。它将禁用按钮
<tree string="Sim Tree" create="false" >
答案 4 :(得分:0)
将create="false"
替换为create="0"
,我也遇到了这个问题。您还具有edit="0"
和delete="0"
来禁用它们。