2016-01-21 6 views
4

Я работаю с Odoo (v9). У меня есть custom: form (для модели 1), action и popup с формой (для модели 2). Вот пример основной формой: Действиеodoo context field. значение по умолчанию для всплывающего окна

<record id="my_id_form" model="ir.ui.view"> 
    <field name="name">my_name_form</field> 
    <field name="model">my_model_one</field> 
    <field name="arch" type="xml"> 
     <form string="Name"> 
      <sheet> 
       <group> 
        <field name="partner_id"/> 
        <!-- button which open popup with my_model_two --> 
        <button string="Open popup" 
          name="%(my_module.action_open_popup)d" 
          type="action" 
          class="btn-link"/> 
       </group> 
      </sheet> 
     </form> 
    </field> 
</record> 

Окно Кнопка Открыть всплывающее окно:

<record id="action_open_popup" model="ir.actions.act_window"> 
    <field name="name">action name</field> 
    <field name="res_model">my_model_two</field> 
    <field name="view_id" ref="model_two_form_popup"/> 
    <!-- 
    How I can send partner_id from main form to popup? 
    I tried different ways in context field, but all in vain 
    <field name="context">{'default_partner_id': ?????,}</field> 
    --> 
    <field name="target">new</field> 
</record> 

Пример my_model_one

class MyModelOne(models.Model): 
    _name = 'my_model_one' 

    partner_id = fields.Many2one('res.partner', string='Partner') 

Форма Всплывающее:

<record id="model_two_form_popup" model="ir.ui.view"> 
    <field name="name">Popup name</field> 
    <field name="model">my_model_two</field> 
    <field name="arch" type="xml"> 
     <form string="Popup text"> 
      <sheet> 
       <group> 
        <field name="partner_id" invisible="1"/> 
       <group> 
      </sheet> 
     </form> 
    </field> 
</record> 

Мой вопрос: Как я могу отправить значение из поля в основной форме в всплывающее окно формы (partner_id)

Я видел, как в коде используется active_id, строки или целые значения?. Но я не нашел, как отправлять значения полей или как регистрировать метод для пользовательской логики. Может ли кто-нибудь дать небольшой пример? Заранее спасибо.

ответ

6

Я нашел решение. В кнопке элемента необходимо добавить контекст так:

<button string="Open popup" 
    name="%(my_module.action_open_popup)d" 
    type="action" 
    class="btn-link" 
    <!-- name_of_parameter: name_of_field --> 
    context="{'partner_id': partner_id}"/> 

После этого необходимо установить значение по умолчанию для всплывающих окон:

<record id="action_open_popup" model="ir.actions.act_window"> 
    <field name="name">action name</field> 
    <field name="res_model">my_model_two</field> 
    <field name="view_id" ref="model_two_form_popup"/> 
    <!-- set default value to field from context parameter by name --> 
    <field name="context">{'default_partner_id': context.get('partner_id', False),}</field> 
    <field name="target">new</field> 
</record> 
+0

Просто помогли мне убить двух зайцев одним выстрелом. – frostymarvelous

+0

@frostymarvelous Я был рад помочь;) –

4

вы можете сделать лучше, контекст может быть динамическим, когда вы используете метод питон, чтобы открыть всплывающее окно, смотрите пример в odoo аддонов:

@api.multi 
def open_popup(self) 
#the best thing you can calculate the default values 
# however you like then pass them to the context 
return { 
     'name': 'Import Module', 
     'view_type': 'form', 
     'view_mode': 'form', 
     'target': 'new', 
     'res_model': 'model.name', 
     'type': 'ir.actions.act_window', 
     'context': {'default_partner_id':value,'default_other_field':othervalues}, 
    } 
+0

Это хорошее решение. Благодарю. –

+0

вы приветствуете моего друга, я новичок в Odoo, но на самом деле легко узнать, что в odoo addons много отличного примера – Cherif

1

в видовом XML:

<field 
    name="item_ids" 
    nolabel="1" 
    domain="['apl_id','=',active_id]" 
    context="{'res_id':active_id}"> 

и model.py (пункты):

_defaults = { 
    "res_id": lambda self,cr,uid,c:c.get('res_id',False) 
} 
+0

Спасибо за еще одно решение. –