Недавно возникла необходимость пробрость значение из формы во всплывающее окно в Odoo. Как всегда это делалось с помощью небольшой магии и поэтому решил это записать.
Создаем виджет
Для демонстрации я создам простой виджет с 2 полями.
demo_widget.py
from odoo import models, fields, api
class DemoWizard(models.TransientModel):
_name = 'demo.wizard'
item_id = fields.Many2one("item", "Код записи")
start_date = fields.Datetime("Дата")
demo_widget.xml
<odoo>
<data>
<record model="ir.ui.view" id="wizard_form_view">
<field name="name">demo.wizard.form</field>
<field name="model">demo.wizard</field>
<field name="arch" type="xml">
<form string="Form">
<group>
<field name="item_id"/>
<field name="start_date"/>
</group>
<footer>
<button special="cancel" string="Отмена"/>
</footer>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="wizard_action_window">
<field name="name">demo</field>
<field name="res_model">demo.wizard</field>
<field name="target">new</field>
<field name="view_mode">form</field>
</record>
</data>
</odoo>
Создаем родительскую форму
Создаем демо модель:
demo_model.py
from odoo import models, fields, api
class DemoModel(models.Model):
_name = 'demo.model'
name = fields.Char("Название")
demo_model.xml
<odoo>
<data>
<record model="ir.ui.view" id="demo_model_form_view">
<field name="name">demo.model.form</field>
<field name="model">demo.model</field>
<field name="arch" type="xml">
<form string="Form">
<footer>
<button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" />
</footer>
<group>
<field name="name"/>
</group>
</form>
</field>
</record>
</odoo>
Работа с контекстом
Для взаимодействия между представлениями в Odoo используется атрибут context
. С помощью него можно задавать переменные которые будут видны в дочерних элементах, например:
<field name="item_ids" context="{'state_ctx':state}">
<tree>
<field name="state" domain="[('state', '=', state_ctx)]/>
<field name="child_table_field1"/>
</tree>
</field>
В пример выше мы передали значения поле state из родительской модели в переменную state_ctx
, которая используется для фильтрации внутри дочерней модели.
Также в оду есть конвенция что если имя имеет вид с default_<field_name>
, то это значение передается полю <field_name> как занчение по умолчанию.
Соответственно если у элемента кнопки заменить:
...
<button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" />
...
на
...
<button name="%(wizard_action_window)d" string="Привязать" type="action" class="oe_highlight" context="{'default_item_id':id}" />
...
То в открывшемся виджете в поле item_id
будет отображен элемент c id родительского.
Заключение
Данное небольшое описание описание еще чуть чуть расширяет представление о возможностях расширения функциональности Odoo через декларативное описание.
comments powered by Disqus