Je travaille avec Odoo (v9). J'ai custom: formulaire (pour le modèle 1), action et popup avec formulaire (pour le modèle 2). Voici l'exemple de formulaire principal:
<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 de la fenêtre pour le bouton Ouvrir la fenêtre contextuelle :
<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 la suivante: comment puis-je envoyer de la valeur depuis un champ du formulaire principal vers un formulaire contextuel ? (Partner_id)
J'ai vu comment dans le code utilisé id_active , chaîne ou valeurs entières. 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 fournir un petit exemple? Merci d'avance.
J'ai trouvé la solution. Dans l'élément button, il faut ajouter context 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 devons définir la valeur par défaut sur popup:
<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>
vous pouvez faire mieux le contexte pourrait être dynamique lorsque vous utilisez une méthode python pour ouvrir la fenêtre popup voir exemple dans les addons 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},
}
En vue xml:
<field
name="item_ids"
nolabel="1"
domain="['apl_id','=',active_id]"
context="{'res_id':active_id}">
et dans model.py (items):
_defaults = {
"res_id": lambda self,cr,uid,c:c.get('res_id',False)
}