Odoo 9表单视图自定义保存方法

时间:2016-07-18 01:29:49

标签: openerp odoo-9

我们正在尝试在安装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中的条目预填充它。 Many2one模型中的Reservation字段是用户可以选择要保留的会话数的当前方式。我们覆盖默认的create命令,根据ResNumber字段的值创建会话数。

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

1 个答案:

答案 0 :(得分:1)

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

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

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