【问题标题】:computed field that does not compute and default that does not work (odoo-12)不计算且默认不工作的计算字段(odoo-12)
【发布时间】:2019-04-04 20:05:09
【问题描述】:

我的模型中有一个方法,该字段旨在检测 many2one 中的变化:

manytoone = fields.Many2one(comodel_name="product.template", string="Many to One",
                                required=False, )

cambio_realizado = fields.Boolean(string="Cambios en Many to One", default=False)

@api.onchange('manytoone')
def _detectar_cambio(self):
    self.cambio_realizado = True

在布尔字段中默认 = False 无效。始终以 True 开头。

另一个问题是计算域不起作用:

@api.multi
def computer_function(self):
    self.computation = 243+234

    computation = fields.Float(string="Result: ", compute=computer_function, readonly=True)

结果为零...始终在视图中。

标识ok,继承模型

我的班级和我对提示的看法:

class CustomModule(models.Model):
    _inherit = 'sale.order'

    name = fields.Char('campos relacionales, decoradores onchange y funcion computar')

    manytoone = fields.Many2one(comodel_name="product.template", string="Many to One",
                                required=False, )

    cambio_realizado = fields.Boolean(string="Cambios en Many to One")

    @api.onchange('manytoone')
    def _detectar_cambio(self):
        self.cambio_realizado = True

    onetomany = fields.One2many(comodel_name="sale.order", inverse_name="manytoone",
                                    string="One to Many", required=False, )
    manytomany = fields.Many2many(comodel_name="sale.order",
                                     relation="sale_handler",
                                  column1="order_id", column2="order_handler_id",
                                  string="Many to Many", )

    @api.depends('computation')
    def computer_function(self):
        for record in self:
            record.computation = 300

    computation = fields.Float(string="Result: ", compute=computer_function, readonly=True)

<odoo>
<!-- Inherit Form View to Modify it -->
<record id="custom_view_custom" model="ir.ui.view">
    <field name="name">custom.view.custom</field>
    <field name="model">sale.order</field>
    <field name="inherit_id" ref="sale.view_order_form"/>
    <field name="arch" type="xml">

        <xpath expr="//sheet" position="inside">
            <group>
            <field name="manytoone"/>
            <field name="onetomany"/>
            <field name="manytomany"/>
            </group>
            <group>
                <field name="computation"/>
                <field name="cambio_realizado"/>
            </group>
        </xpath>

    </field>
</record>

</odoo>

【问题讨论】:

    标签: odoo-12


    【解决方案1】:

    @api.one def 计算机功能(自我): self.computation = 243+234

    computation = fields.Float(string="Result: ", compute=computer_function, readonly=True)
    

    在你的代码中使用@api.one

    【讨论】:

    • 一个或多个有什么不同?也不适用于 @api.one。
    【解决方案2】:

    1- onchnage,当你尝试创建新记录时,onchange 会自动调用,然后 cambio_realizado 设置为 true

    @api.onchange('manytoone')
    def _detectar_cambio(self):
        for o in self:
            if o.manytoone:
                o.cambio_realizado = True
    

    2- 在计算中最好使用 api.depends('somefield'),但下面的代码可能对你有用,使用循环,不要使用只读

    @api.multi
    def computer_function(self):
        for o in self:
            o.computation = 243+234
    
    computation2 = fields.Float(string="Result: ", compute=computer_function)
    

    【讨论】:

    • 1.哦,我们怎样才能避免一开始就被召唤呢?那,我想开始 False,只有在更改字段时才更改。 2. 多么令人沮丧,没有任何作用。如果我留下了一些细节,我将再次复制所有代码,因为我已经尝试了几种组合。 (我将使用所有代码编辑问题)
    • 但是 false 是一个值改变了 :) ,如果你使用 'if o.manytoone' 那么 o.cambio_realizado = True 只在 o.manytoone 不为空时执行
    猜你喜欢
    • 2018-07-03
    • 2020-04-27
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多