如何在Odoo中打开现有视图但禁用其创建按钮?

时间:2019-05-08 11:52:32

标签: xml odoo

我有一个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标记中。我试图避免这种情况有几个原因:

  1. 如果可能,我想重用现有代码。
  2. 树状视图可能在不同模块中添加了很多字段(例如我的情况)。我必须修改自定义模块depends的{​​{1}}参数,使其包含所有插入这些字段的模块。但是,我的模块完全不依赖那些模块,我只需要复制树形视图即可。
  3. 由于第2点,如果在模块之后安装了向源树视图添加字段的模块,则这些新字段将不会显示在我的树视图(带有__manifest__.py的视图)中。

所以我问是否有人知道一种使用现有视图的方法(而不是将其字段粘贴在create="false"标签内)但禁用其 Create 选项。

5 个答案:

答案 0 :(得分:3)

有趣的问题。我实际上不知道是否可以这样做,但是可以结合使用tree_view_ref,视图modepriority来实现。

解决方案

我创建了两个简单的插件(custom_saletest_addon)进行测试。第一个只是将新字段添加到sale.order树视图之一。我这样做是为了确保其他模块也在One2many中也显示新字段。

custom_sale:

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>

test_addon:

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。我们必须确保新视图的modeprimary。并且我们设置了足够高的优先级,以确保由我们不依赖的其他模块添加的字段也出现在我们的视图中(我认为优先级可以高达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"来禁用它们。