-->

Set default value while creating record from one2m

2019-02-16 03:07发布

问题:

I want to set default value for multiple fields while creating records from one2many field, in that default value will be taken from the parent model.

Odoo Model Structure

class purchase_order(models.Model):
    _inherit='purchase.order'

    cash_forecast_ids = fields.One2many(comodel_name='cash.forecast', inverse_name='purchase_order_id', string='Payment Schedules')


class cash_forecast(models.Model):
    _name='cash.forecast'

    purchase_order_id = fields.Many2one(comodel_name='purchase.order', string='PO', select=True, copy=False)
    foreign_currency_amount = fields.Float("Foreign Currency Amount", copy=False)
    currency_id = fields.Many2one(comodel_name="res.currency", string="Currency", copy=False)
    company_id = fields.Many2one(comodel_name='res.company', string='Company')

Problem : Now what I want to do is, I want to set currency and company from the purchase order while the cash forecast record will be created from the PO form view, but I don't know how to do it.

NOTE : I am not able take currency or company field related or functional because there are few other situations for which company and currency should be entered manually and in that no PO reference will be set.

PO Form View

<page string="Deliveries &amp; Invoices" position="after">
    <page string="Payment Scedule">
        <field name="cash_forecast_ids" attrs="{'readonly' : [('state','in',['done','cancel'])]}">
            <tree string="Payment Scedule" editable="bottom">
                <field name="name"/>
                <field name="cash_forecast_type_id" required="1" domain="[('add_to_po_payment_schedule','=',True)]" />
                <field name="note" />
                <field name="forecast_date" />
                <field name="period_id" required="1" />
                <field name="foreign_currency_amount" required="1" />
                <field name="currency_id" required="1" />
                <field name="purchase_order_id" invisible="1"/>
                <field name="company_id" required="1" /> 
            </tree>
        </field>
    </page>
</page>

Can any one suggest me, what should I do in that case ?

回答1:

I got the way how to do it.

In order to set default values directly while adding records in one2many fields, we need to set values in context with prefix default_field_name : value.

context="{'default_currency_id' : currency_id, 'default_company_id' : company_id}"

Note: active_id is not available while you creating new record and with that new record if you provide value in one2many model then active id(s) won't be there. It's only accessible once you save the parent record.

Solution :

<field name="cash_forecast_ids" context="{'default_currency_id' : currency_id, 'default_company_id' : company_id}">
    <tree string="Payment Scedule" editable="bottom">
        <field name="name"/>
        <field name="forecast_date" />
        <field name="foreign_currency_amount" required="1" />
        <field name="currency_id" domain="[('id','=',parent.currency_id)]" required="1" />
        <field name="purchase_order_id" invisible="1"/>
        <field name="company_id" domain="[('id','=',parent.company_id)]" required="1" /> 
    </tree>
</field>

If you want to add domain in fields of one2many model and in that you want to use the values of parent model then you can do it by the following way.

<field name="company_id" domain="[('id','=',parent.company_id)]" />


回答2:

To send parent value to one2many field define context on one2many field in XML, to use context append "default_" as prefix to desired field e.g. "default_state" as a key and for value use parent table field name.

<field name="external_evaluation_ids" context="{'default_state':state}">
 <tree>
  <field name="state"/> <!--newly created field in one2many table-->
  <field name="child_table_field1"/>
  <field name="child_table_field2"/>
  <field name="child_table_field2"/>
 </tree>
</field>

In above code snippet we have one2many field and in that field we define context with key value. Here name of key will starts from "default_" and than the field name, the value should be the parent table field name which we want to display in one2many pop up form view. For further info http://learnopenerp.blogspot.com/2018/01/get-parent-form-value-in-one2many-form.html