2016-01-21 1 views
4

Je travaille avec Odoo (v9). J'ai personnalisé: forme (pour le modèle 1), action et popup avec forme (pour le modèle 2). Voici exemple sous forme principale:champ de contexte odoo. valeur par défaut pour popup

<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> 

action fenêtre pour le bouton Ouvrir le menu:

<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> 

Exemple my_model_one

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

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

forme Popup:

<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> 

Ma question est: Comment puis-je envoyer la valeur du champ sous forme principale-formulaire popup (partner_id)

J'ai vu comment dans le code utilisé active_id, les valeurs de chaîne ou entier?. Mais je n'ai pas trouvé comment envoyer des valeurs de champs ou comment enregistrer une méthode pour une logique personnalisée. Quelqu'un peut-il donner un petit exemple? Merci d'avance.

Répondre

6

J'ai trouvé la solution. Dans le bouton élément nécessaire d'ajouter contexte comme ceci:

<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}"/> 

Après cela, nous avons besoin de définir la valeur par défaut pop-up:

<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

Juste m'a aidé à tuer deux oiseaux avec une pierre. – frostymarvelous

+0

@frostymarvelous J'ai été heureux d'aider;) –

4

vous pouvez faire mieux le contexte pourrait être dynamique lorsque vous utilisez un méthode python pour ouvrir la fenêtre contextuelle voir par exemple dans les Odoo addons:

@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

C'est une bonne solution. Merci. –

+0

vous accueillir mon ami je suis nouveau dans Odoo mais est vraiment facile à apprendre il y a beaucoup de grand exemple dans les addons odoo – Cherif

1

Vu xml:

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

et model.py (articles):

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

Merci pour la solution un plus. –