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

Odoo 10 - Form view opened in edit mode

我正在 Odoo 10 上开发。

我创建了一个动态表单视图,它根据条码搜索和显示产品,但我遇到了问题。

由于视图没有要显示的初始记录,因此它以编辑模式打开,没关系,因为我想输入 'barcode' 字段。
但是,在显示产品后,当我退出该视图时,'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

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

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

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

这意味着我们创建了一个模型,该模型了解模型的知识,但在新数据库 table 中添加了额外的 data/columns。因此,当您创建用户时,所有合作伙伴数据都存储在 res_partner table(并且创建了一个合作伙伴),所有用户相关信息都存储在 res_users table.

在您的代码中,当向导 (levelprime_product_general_status.product_from_barcode) 记录将创建然后所有 product.product/product.template 字段是必需的,因此您会收到此类错误。

您可以通过以下 link.

查看 _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

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

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

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

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

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

我创建了一种继承自 '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
})

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

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

那么您可以简单地使用 xml 中的标签。