как создать кнопку открывающую попап без автоматической регистрации/создания формы odoo13

Я хочу создать кнопку, которая открывает всплывающее окно, которое занимает некоторые поля формы. Эти поля можно изменить/заполнить. При закрытии соответствующие поля обновляются. без сохранения или создания записи, прежде чем я нажму кнопку «Сохранить». Я не вижу, как добраться туда, зная, что нет никаких реляционных полей. Должен ли я создать виджет, мастер, оба .... Помогите мне, пожалуйста.

Вот мой текущий код:

test_scale.py:

# -*- coding: utf-8 -*-
from odoo import models, fields, api


class TestScale(models.Model):
    _name = 'test.scale'

    name = fields.Char(required=True)
    weighing = fields.Integer('weighing', default=0)

test_scale.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
    <record id="test_scale_tree_view" model="ir.ui.view">
        <field name="name">test.scale.tree</field>
        <field name="model">test.scale</field>
        <field name="arch" type="xml">
            <tree string="Test scale">
                <field name="name"></field>
                <field name="weighing"></field>
            </tree>
        </field>
    </record>

    <record id="test_scale_form_view" model="ir.ui.view">
        <field name="name">test.scale.form</field>
        <field name="model">test.scale</field>
        <field name="arch" type="xml">
            <form string="Test scale">
                <sheet>
                    <group name="main_info">
                        <field name="name"></field>
                        <field name="weighing"></field>
                        <button name="%(test_scale_configurator_action)d"
                                type="action"
                                string="Weighing"
                                class="oe_highlight"
                                context="{'weighing': weighing}"></button>
                    </group>
                </sheet>
            </form>
        </field>
    </record>


    <record id="saisie_menu_action" model="ir.actions.act_window">
        <field name="name">Test_scale</field>
        <field name="res_model">test.scale</field>
        <field name="type">ir.actions.act_window</field>
        <field name="view_mode">tree,form</field>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">Aucun enregistrement
            </p>
        </field>
    </record>


    <menuitem id="test_scale_menu"
              name="Test_scale"/>

    <menuitem id="test_scale_saisie_menu"
              parent="test_scale_menu"
              name="Saisie"
              action="saisie_menu_action"/>
</odoo>

test_scale_configurator.xml:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <record id="test_scale_configurator_view_form" model="ir.ui.view">
        <field name="name">test.scale.configurator.view.form</field>
        <field name="model">test.scale.configurator</field>
        <field name="arch" type="xml">
            <form>
                <field name="weighing"/>
                <footer>
                    <button type="object"
                            name="button_save"
                            string="Save"
                    />
                    <button special="cancel"
                            string="Cancel"
                            class="btn-secondary"/>
                </footer>
            </form>
        </field>
    </record>

    <record id="test_scale_configurator_action" model="ir.actions.act_window">
        <field name="name">Test Scale</field>
        <field name="res_model">test.scale.configurator</field>
        <field name="view_mode">form</field>
        <field name="target">new</field>
        <field name="view_id" ref="test_scale_configurator_view_form"/>
    </record>
</odoo>

test_scale_configurator.py:

# -*- coding: utf-8 -*-

from odoo import models, fields


class TestScaleConfigurator(models.TransientModel):
    _name = 'test.scale.configurator'

    weighing = fields.Integer(string='weighing')

    def button_save(self):
        self.ensure_one()
        return True

person Brenda    schedule 07.10.2020    source источник


Ответы (1)


Это делается реляционными полями odoo. Для EX: -

В вашей модели test.scale ваше поле weighing,

Сначала вам нужно настроить идентификатор вашей текущей модели test.scale в мастере, чтобы вы могли ссылаться на него, например, вы можете добавить поле в мастере.

test_scale_id = fields.Many2one(string="Test Scale")

После этого добавьте context в xml-файл вашей основной модели, где находится кнопка, которая открывает мастер таким образом.

<button name="%(test_scale_configurator_action)d"
                            type="action"
                            string="Weighing"
                            class="oe_highlight"
                            context="{'default_test_scale_id': active_id}"></button>

После этого это поле должно быть невидимым в форме вашего мастера, чтобы сохранить данные в мастере, чтобы вы могли ссылаться на них позже.

<field name="test_scale_id" invisible="1"/>

и в вашем мастере поле взвешивания осталось таким.

weighing = fields.Integer(string='weighing', related='test_scale_id.weighing', readonly=False)

Примечание. Этот процесс создания поля выполняется один раз.

после этого вы можете использовать любое поле, которое есть в вашей основной модели, и вы хотите использовать его в мастере, вы можете получить эти поля с помощью test_scale_id.any_of_your_field.

person Saumil gauswami    schedule 07.10.2020
comment
Привет. Спасибо за ваш ответ. Я внес предложенные вами изменения. Но когда я нажимаю кнопку, которая вызывает мастер, форма автоматически сохраняется, хотя пользователь не нажал кнопку сохранения. Я хотел бы, чтобы форма сохранялась только тогда, когда пользователь нажимает кнопку «Сохранить». - person Brenda; 08.10.2020
comment
Итак, добавьте readonly=False в файл мастера, я редактирую свой ответ, пожалуйста, проверьте. - person Saumil gauswami; 08.10.2020
comment
Хорошо. Мастер вызывается нажатием кнопки, которая автоматически сохраняет мою форму, как если бы я нажал «Сохранить». Но я не хочу, чтобы моя форма сохранялась, когда я нажимаю кнопку взвешивания. И даже с вашими доработками так и есть. Должен ли я пройти через виджет? Если да, то как я могу подключить кнопку виджета к моему формулируру.xml и как эта кнопка виджета может вызвать метод python? - person Brenda; 08.10.2020