Odoo 9 表单视图自定义保存方法
Odoo 9 form view custom saving method
我们正在尝试在 Odoo 9 安装中实施自定义预订类型的解决方案。该解决方案包括一个 Reservation
模型和一个 Session
模型。 Reservation
的功能之一是作为 Sessions
的关联容器。 Session
模型有一个 Many2one
字段链接到 Reservation
模型。
至此,我们已经定义了模型和一个允许我们创建新预订的标准表单视图。但是,我们希望视图包含一个下拉小部件,允许我们 select 伴随会话的数量,并且我们希望保留保存功能来创建适当数量的会话。
我们在实现这个过程中遇到了两个问题:
我们如何才能包含实际上未绑定到模型字段的小部件(带有数字 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
字段是用户可以 select 保留多少会话的当前方式。我们覆盖了默认创建命令,以根据 ResNumber
字段的值创建会话数。
然而,我们想要的是完全删除 ResNumber
模型。将此数字存储在 table 中不是一个好的数据库实践,因为它可以通过备用查询派生。我们想要做的是在 Reservation
模型的表单视图中包含一个字段,其编号为 selection,然后在创建 Session
实例后立即丢弃该值.有什么办法吗?
使用选择字段并将商店 属性 设置为 False
fields.Selection([(1, '1'),
(2, '2'),
(3, '3'),
(4, '4')], string='ResNumber' store=False)
这很简单,如果 '1'
在前端显示给用户,但在后端返回的值是整数 1
并且当您设置store to False 您告诉 odoo 不要将值存储在数据库中(它可能应该只用于向用户显示信息或形成某种计算或逻辑)
我们正在尝试在 Odoo 9 安装中实施自定义预订类型的解决方案。该解决方案包括一个 Reservation
模型和一个 Session
模型。 Reservation
的功能之一是作为 Sessions
的关联容器。 Session
模型有一个 Many2one
字段链接到 Reservation
模型。
至此,我们已经定义了模型和一个允许我们创建新预订的标准表单视图。但是,我们希望视图包含一个下拉小部件,允许我们 select 伴随会话的数量,并且我们希望保留保存功能来创建适当数量的会话。
我们在实现这个过程中遇到了两个问题:
我们如何才能包含实际上未绑定到模型字段的小部件(带有数字 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
字段是用户可以 select 保留多少会话的当前方式。我们覆盖了默认创建命令,以根据 ResNumber
字段的值创建会话数。
然而,我们想要的是完全删除 ResNumber
模型。将此数字存储在 table 中不是一个好的数据库实践,因为它可以通过备用查询派生。我们想要做的是在 Reservation
模型的表单视图中包含一个字段,其编号为 selection,然后在创建 Session
实例后立即丢弃该值.有什么办法吗?
使用选择字段并将商店 属性 设置为 False
fields.Selection([(1, '1'),
(2, '2'),
(3, '3'),
(4, '4')], string='ResNumber' store=False)
这很简单,如果 '1'
在前端显示给用户,但在后端返回的值是整数 1
并且当您设置store to False 您告诉 odoo 不要将值存储在数据库中(它可能应该只用于向用户显示信息或形成某种计算或逻辑)