【问题标题】:How to save value on Readonly / editable false fields in odoo Models?如何在 odoo 模型中保存只读/可编辑错误字段的值?
【发布时间】:2015-11-26 21:06:23
【问题描述】:

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

如果我将该字段设置为 readonly=1 或 editable=0,则不会存储该值。

我正在尝试在发票上设置全局折扣

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

在布局中:

<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" attrs,效果会很好

【问题讨论】:

    标签: model field openerp odoo-8


    【解决方案1】:

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

    希望对你有帮助!!

    【讨论】:

    • force_save="1" 适用于只读字段,因此您将保存此字段,它工作完美,非常感谢
    • 也适用于 12.0,谢谢!!阅读更多关于这个here
    • 在 11.0 中,如果您将 1 应用于 invoice_line_ids,则在树视图(发票行)中,readonly="1" 将不起作用(它禁用 editable="bottom" 并且记录是可编辑的),但是如果您申请树视图中的每个字段,它就可以工作。解决了我的问题,非常感谢!
    【解决方案2】:

    尝试将字段定义为

    neto = fields.Float('Neto', compute='_compute_amount', store=True)
    global_discount = fields.Float('Descuento', compute='_compute_amount', store=True)
    

    【讨论】:

      【解决方案3】:

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

      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
      

      在布局中:

      <field name="global_discount" readonly="1"/>
      

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2020-09-16
        • 1970-01-01
        • 1970-01-01
        • 2016-11-07
        • 2011-07-24
        • 2014-01-19
        • 2017-09-21
        • 2011-02-26
        • 1970-01-01
        相关资源
        最近更新 更多