首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在odoo模型中保存Readonly / editable false字段的值?

如何在odoo模型中保存Readonly / editable false字段的值?
EN

Stack Overflow用户
提问于 2015-11-27 05:06:23
回答 3查看 11.9K关注 0票数 4

我有一个字段,我想在更改时计算它的值,但我不希望用户可以修改它。

如果我将字段设置为readonly=1或editable=0,则值不是store。

我正在尝试为发票设置全球折扣。

代码语言:javascript
复制
class account_invoice(models.Model):
    _inherit = "account.invoice"

    global_discount_p = fields.Float('Descuento porcentaje')
    global_discount = fields.Float('Descuento')
    neto = fields.Float('Neto')

    @api.one
    @api.depends('invoice_line.price_subtotal', 'tax_line.amount','global_discount_p')
    def _compute_amount(self):
        ret = super(account_invoice,self)._compute_amount()
        if self.type == 'in_invoice':
            self.neto = self.amount_untaxed
            discount = self.global_discount_p/100
            self.global_discount = self.neto * discount
            self.amount_untaxed = self.neto - self.global_discount

            for line in self.tax_line:
                line.base = self.amount_untaxed
                line.amount = line.amount - (line.amount * discount)

            self.amount_tax = sum(line.amount for line in self.tax_line)
            self.amount_total = self.amount_untaxed + self.amount_tax

        return ret

在布局中:

代码语言:javascript
复制
<xpath expr="//field[@name='amount_untaxed']" position="before">
                <field name="neto" readonly="1"/>
                <field name="global_discount_p" onchange="_compute_amount"/>
                <field name="global_discount" readonly="1"/>
            </xpath>

如果我从字段中删除readonly="1“属性,它就能正常工作

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-27 08:05:09

尝试将字段定义为

代码语言:javascript
复制
neto = fields.Float('Neto', compute='_compute_amount', store=True)
global_discount = fields.Float('Descuento', compute='_compute_amount', store=True)
票数 3
EN

Stack Overflow用户

发布于 2018-08-18 15:48:47

odoo11中,您可以在xml文件中使用force_save="1"

希望它能帮助你!!

票数 14
EN

Stack Overflow用户

发布于 2017-01-18 14:17:40

在account_invoice类中覆盖这两个方法并声明字段,如下所示,

代码语言:javascript
复制
global_discount = fields.Float('Descuento', readonly=True)



@api.model
def create(self, vals):
    if vals['global_discount']:
        if vals['type'] == 'in_invoice':
        vals['neto'] = vals['amount_untaxed']
        discount = vals['global_discount_p']/100
        vals['global_discount'] = vals['neto'] * discount
        vals['amount_untaxed'] = vals['neto'] - vals['global_discount']

        for line in vals['tax_line']:
            line.base = vals['amount_untaxed']
            line.amount = line.amount - (line.amount * discount)

        vals['amount_tax'] = sum(line.amount for line in vals['tax_line'])
        vals['amount_total'] = vals['amount_untaxed'] + vals['amount_tax']
    res = super(PersonInformation, self).create(vals)
    return res

@api.multi
def write(self, vals):
    if vals['global_discount']:
        if vals['type'] == 'in_invoice':
        vals['neto'] = vals['amount_untaxed']
        discount = vals['global_discount_p']/100
        vals['global_discount'] = vals['neto'] * discount
        vals['amount_untaxed'] = vals['neto'] - vals['global_discount']

        for line in vals['tax_line']:
            line.base = vals['amount_untaxed']
            line.amount = line.amount - (line.amount * discount)

        vals['amount_tax'] = sum(line.amount for line in vals['tax_line'])
        vals['amount_total'] = vals['amount_untaxed'] + vals['amount_tax']
    res = super(PersonInformation, self).create(vals)
    return res

在布局中:

代码语言:javascript
复制
<field name="global_discount" readonly="1"/>

我希望这能对你有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33946981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档