【问题标题】:Odoo 9 form view custom saving methodOdoo 9 表单视图自定义保存方法
【发布时间】:2016-07-18 01:29:49
【问题描述】:

我们正在尝试在安装的 Odoo 9 中实施自定义预订类型的解决方案。该解决方案包括 Reservation 模型和 Session 模型。 Reservation 的功能之一是作为Sessions 的关联容器运行。 Session 模型有一个 Many2one 字段将其链接到 Reservation 模型。

此时,我们已经定义了模型和标准表单视图,允许我们创建新的预订。但是,我们希望视图包含一个下拉小部件,允许我们选择伴随会话的数量,并且我们希望保留保存功能创建适当数量的会话。

在实现这一点时,我们正在努力解决两个部分:

  • 我们如何才能包含一个实际上不与模型字段绑定的小部件(带有数字 1-8 的下拉菜单)?执行下一点中提到的命令后,该值将立即释放。

  • 有没有办法覆盖标准保存功能来执行自定义代码(创建与自定义小部件的值对应的会话数并用标准值预填充它们),还是我们必须创建一个完全自定义的操作并隐藏表单视图上的默认保存按钮? 我们已经弄清楚了,正如您在我们的代码中看到的那样。

我们不需要任何人为我们编写代码,但由于我们是该平台的新手,因此可以为我们指明适当方法的总体方向。

编辑:

以下是我们目前掌握的相关代码:

models.py

class ResNumber(models.Model):
    _name = 'restest.res_num'
    name = fields.Char(string="Number to book", required=True)
    num = fields.Integer(string="Number", required=True)

class Reservation(models.Model):
    _name = 'restest.reservations'
    name = fields.Char(string="Title", required=True)
    num_booked = fields.Many2one('restest.res_num', ondelete='set null', string="Number to book")
    slot_id = fields.Many2one('restest.slots', ondelete='set null', string="Slot ID")
    session_ids = fields.One2many('restest.sessions', 'reservation_id', string="Session IDs")
    customer = fields.Many2one('res.partner', ondelete='set null', string="Customer")

    @api.model
    def create(self, vals):
        res_id = super(Reservation, self).create(vals)
        numValue = res_id.num_booked.num
        resIdValue = res_id.id
        start = 1
        while start <= numValue:
            self.env['restest.sessions'].create({'name': start, 'reservation_id': resIdValue})
            start = start + 1
        return res_id

class Session(models.Model):
    _name = 'restest.sessions'
    name = fields.Char(string="Title", required=True)
    reservation_id = fields.Many2one('restest.reservations', ondelete='set null', string ="Reservation ID")

views.xml

<record model="ir.ui.view" id="reservation_create_view">
            <field name="name">reservation.form</field>
            <field name="model">restest.reservations</field>
            <field name="arch" type="xml">
                <form string="Make a Reservation">
                    <sheet>
                        <group>
                            <field name="name"/>
                            <field name="slot_id"/>
                            <field name="num_booked"/>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.actions.act_window" id="make_res_action">
            <field name="name">Make a Reservation</field>
            <field name="res_model">restest.reservations</field>
            <field name="view_type">form</field>
            <field name="view_mode">form</field>
            <field name="view_id" ref="reservation_create_view"/>
        </record>

defaultData.xml

<?xml version="1.0" encoding="utf-8"?>
    <openerp>
    <record id="first_cat" model="restest.res_num">
        <field name="name">1</field>
        <field name="num">1</field>
    </record>
    <record id="second_cat" model="restest.res_num">
        <field name="name">2</field>
        <field name="num">2</field>
    </record>
    <record id="third_cat" model="restest.res_num">
        <field name="name">3</field>
        <field name="num">3</field>
    </record>
    <record id="fourth_cat" model="restest.res_num">
        <field name="name">4</field>
        <field name="num">4</field>
    </record>
</openerp>

所以这里的测试实现非常简单。我们创建了ResNumber 模型并预先填充了 1-4 的条目。 Reservation 模型中的Many2one 字段是用户可以选择保留多少会话的当前方法。我们覆盖了默认的 create 命令以根据 ResNumber 字段的值创建会话数。

但是,我们想要的是完全删除 ResNumber 模型。将此数字存储在表中不是一个好的数据库实践,因为它可以通过备用查询派生。我们想要做的是在Reservation 模型的表单视图中包含一个带有数字选择的字段,然后在创建Session 实例后立即丢弃该值。有什么办法吗?

【问题讨论】:

  • 您应该展示您的代码和您当前的尝试,以便我们为您提供帮助
  • 好点@danidee。现在已经添加了,我应该添加,因为昨晚我们已经解决了第二个问题。
  • 您是否要更改 many2one 字段 的下拉框中的记录数?

标签: openerp odoo-9


【解决方案1】:

使用选择字段并将 store 属性设置为 False

fields.Selection([(1, '1'), 
                  (2, '2'), 
                  (3, '3'), 
                  (4, '4')], string='ResNumber' store=False)

这很简单,在 '1' 的情况下,前端显示给用户,但在后端返​​回的值是整数 1,当您将 store 设置为 False 时告诉 odoo 不要将值存储在数据库中(它可能只是用于向用户显示信息或形成某种计算或逻辑)

【讨论】:

  • 我们走偏了,这个项目被搁置了,但我终于能够测试它了。感谢您简洁明了的回答。
猜你喜欢
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多