Odoo 10 - 在编辑模式下打开表单视图

时间:2017-03-31 14:53:23

标签: openerp odoo-view

我正在开发Odoo 10。

我创建了一个动态表单视图,可以从条形码中搜索和显示产品,但我遇到了问题。

由于视图没有要显示的初始记录,因此它在编辑模式下打开,这没关系,因为我想输入'条形码'字段。
但是,在显示产品后,当我从该视图退出时,会触发'can_be_discarded'功能,打开确认对话框。

我是否要创建从FormView继承的新视图类型,或者有办法解决此问题吗?

视图是一个经典的表单视图,没有什么特别之处 这是服务器代码。

class ProductFromBarcode(models.TransientModel):
    _name = 'levelprime_product_general_status.product_from_barcode'
    _inherits = { 'product.product': 'product_id' }

    product_id      = fields.Many2one(
                            comodel_name='product.product',
                            store=False)
    product_barcode = fields.Integer(help='Insert the barcode to search '
                                          'the correspondent product',
                                     store=False)

    @api.onchange('product_barcode')
    def on_barcode_changed(self):
        if self.product_barcode != 0:
            self.product_id = self.get_product_from_barcode(self.product_barcode)

    @api.model
    def get_product_from_barcode(self, barcode):
        r = self.env['product.product'].search([('barcode', '=', barcode)])
        if r:
            return r

3 个答案:

答案 0 :(得分:1)

好吧,我认为我的方法正确,有一些渲染问题需要解决,但主要的行为是我在寻找的。

我创建了一种新类型的视图,该视图继承自' FormView' ,并覆盖' can_be_discarded' 方法不执行有关数据更改的控制。

JS

odoo.define('levelprime_product_general_status.readonly_formview', function(require) {
    'use strict'

    var core = require('web.core')
    var FormView = require('web.FormView')

    var ReadOnly_FormView = FormView.extend({
        init: function() {
            this._super.apply(this, arguments)
        },
        start: function() {
            this._super.apply(this, arguments)
        },
        can_be_discarded: function() {
            return $.Deferred().resolve()
        }
    })

    core.view_registry.add('readonly_form', ReadOnly_FormView)

    return ReadOnly_FormView
})

PY

class ViewExtension(models.Model):
    _inherit = 'ir.ui.view'

    type = fields.Selection(selection_add=[
        ('readonly_form', 'ReadOnly Form Version')])

然后你可以简单地在xml中使用标签。

答案 1 :(得分:0)

您在向导中使用了 _inherits = {'product.product':'product_id'}

使用 _inherits 时,您将以数据库方式执行某种多态模型。

例如 product.product继承product.template res.users继承res.partner

这意味着我们创建了一个模型,该模型可以了解模型,但在新数据库表中添加了附加数据/列。因此,当您创建用户时,所有合作伙伴数据都存储在 res_partner 表中(并创建了合作伙伴),所有与用户相关的信息都存储在 res_users 表中。

在您的代码中,当创建向导( levelprime_product_general_status.product_from_barcode )记录时,所有 product.product / product.template 字段都是必需的,因为这样您才能获得这种错误。

你可以检查_inherit& _inherits来自以下链接。

https://www.odoo.com/forum/how-to/developers-13/the-different-openerp-model-inheritance-mechanisms-what-s-the-difference-between-them-and-when-should-they-be-used-46

您需要遵循以下代码。

class ProductFromBarcode(models.TransientModel):
    _name = 'levelprime_product_general_status.product_from_barcode'

    product_id= fields.Many2one(comodel_name='product.product',string="Product")
    product_barcode = fields.Char(help='Insert the barcode to search '
                                          'the correspondent product',
                                     "Barcode")

    @api.onchange('product_barcode')
    def on_barcode_changed(self):
        if self.product_barcode:
            self.product_id = self.get_product_from_barcode(self.product_barcode)

    @api.model
    def get_product_from_barcode(self,barcode):
        r = self.env['product.product'].search([('barcode', '=', barcode)])
        if r:
            return r
        else:
            return False

在上面的代码中,只需创建向导&添加两个字段。 这可能会对你有帮助。

答案 2 :(得分:0)

从你所说的你使用继承来显示条形码所选产品的信息将其删除并使用相关字段: 将您在表单视图上显示的字段添加到模型

name = fields.Char(related='product_id.name', readonly=True)

现在,您可以在视图中使用名称,就像计算字段或代理一样。 如果你想要显示它们,你可以只读它们。