1

我正在开发 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
4

3 回答 3

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 中的标签。

于 2017-04-03T09:36:07.310 回答
0

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

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

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

于 2017-04-01T16:40:00.717 回答
0

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

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

例如product.product 继承 product.templateres.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-他们-被使用-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

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

于 2017-03-31T16:29:21.987 回答