Как сохранить данные формы с помощью пользовательской кнопки в Openerp/Odoo

У нас есть форма с полями. Мы добавили нашу собственную кнопку «Сохранить» и хотим сохранить данные в форме на сервере при нажатии этой кнопки.

Мы знаем, как создавать действия на сервере для обработки нажатий кнопок, но не знаем, как получить данные формы.

В настоящее время мы используем встроенную кнопку «Сохранить», но нам нужно активировать некоторые дополнительные функции, отсюда и запрос.

Вот как сейчас выглядит наш XML.

    <record model="ir.ui.view" id="petra_ticket_hold_dialog">
        <field name="name">petra.ticket_request.hold.dialog</field>
        <field name="model">petra.ticket_request</field>
        <field name="arch" type="xml">
            <form string="Hold Ticket" edit="false" create="false" delete="false">
                <sheet>
                    <group colspan="2">
                        <field name="hold_reason"/>
                        <field name="status" invisible="1"/>
                    </group>
                    <button string="Save" />
                </sheet>
            </form>
        </field>
    </record>

person frostymarvelous    schedule 05.04.2016    source источник
comment
Не лучше ли добавить дополнительную функциональность к существующей функции сохранения, а не добавлять новую альтернативную?   -  person Ludwik Trammer    schedule 05.04.2016
comment
Мы занимаемся odoo всего 5 дней. К сожалению, документация не слишком велика. Мы были бы признательны, если бы вы могли показать нам, как или указать нам правильное направление.   -  person frostymarvelous    schedule 05.04.2016
comment
Так что я просто посмотрел, и это не сработает для нас. По сути, у нас есть диалог, и его нужно закрыть после кнопки сохранения. Переопределение функции сохранения требует, чтобы мы возвращали true или false, поэтому мы не можем вернуть действие, чтобы закрыть окно.   -  person frostymarvelous    schedule 05.04.2016
comment
Значит, это волшебник? и вы хотите сохранить то, что вы завершаете в мастере?   -  person dccdany    schedule 05.04.2016
comment
@dccdany Как только вы нажмете кнопку, чтобы закрыть заявку, мы откроем диалоговое окно, в котором вам будет предложено ввести решение. В диалоговом окне мы показываем вам только диалоговое окно причины, которое обновляет заявку после ее сохранения. В ходе нашего расследования был предложен волшебник. Как вы думаете, будет ли лучше использовать это? Если да, есть ли хорошие ресурсы по его реализации в версии 8?   -  person frostymarvelous    schedule 06.04.2016
comment
Если подумать, волшебник имеет большой смысл. Я тоже посмотрю, что найду сам.   -  person frostymarvelous    schedule 06.04.2016
comment
Если вы расскажете мне пример использования, я могу помочь вам с этим, например, у вас есть поле в основной форме (заявка), когда вы хотите закрыть заявку, вам нужно проанализировать решение в поле заявки, скажем, Решение. Но это поле можно будет записать только из нового окна (Мастера). Если это так, то все довольно просто.   -  person dccdany    schedule 06.04.2016
comment
У нас есть билетная модель. Одним из полей модели является решение. Однако мы не отображаем его на форме. Когда пользователь хочет закрыть заявку, он нажимает кнопку закрытия, которая имеет действие на сервере, которое открывает окно с полем решения и скрытым полем статуса, поэтому, когда решение изменяется, мы обновляем его до закрытого. Как мы можем добиться этого с помощью мастера?   -  person frostymarvelous    schedule 06.04.2016
comment
Я правильно понимаю? У вас есть какая-то main форма. Когда пользователь нажимает на какую-либо ссылку, вы показываете petra_ticket_hold_dialog. Вы хотите создать собственный обработчик при нажатии Сохранить на стороне сервера и закрыть диалоговое окно. Это правильно?   -  person Danila Ganchar    schedule 06.04.2016
comment
В яблочко! @DanilaGanchar   -  person frostymarvelous    schedule 06.04.2016


Ответы (1)


Вот небольшой пример, который может вам помочь. Прежде всего вам нужно добавить какое-то действие модели к кнопке, например:

<record model="ir.ui.view" id="petra_ticket_hold_dialog">
        <field name="name">petra.ticket_request.hold.dialog</field>
        <field name="model">petra.ticket_request</field>
        <field name="arch" type="xml">
            <form string="Hold Ticket" edit="false" create="false" delete="false">
                <sheet>
                    <group colspan="2">
                        <field name="hold_reason"/>
                        <field name="status" invisible="1"/>
                    </group>
                    <!-- it means that will be calls method 'action_my_action' of object 'petra.ticket_request' -->
                    <button string="Save" name="action_my_action" type="object"/>
                </sheet>
            </form>
        </field>
    </record>

После этого вам нужно добавить метод в вашу модель:

# you can use @api.multi for collection processing like this:
# for ticket in self: ...something do here
# or you can use @api.model for processing only one object
@api.model
def action_my_action(self):
    # here you have values from form and context
    print(self.hold_reason, self._context)
    # todo something here... and close dialog
    return {'type': 'ir.actions.act_window_close'}

Перезапустите openerp-server и обновите модуль.

Будь осторожен! Объект будет сохранен в БД до вашего action_my_action. Надеюсь, это поможет вам.

person Danila Ganchar    schedule 06.04.2016
comment
Идеальный! Я не знал, что могу использовать self для получения значений. Превосходно! Спасибо еще раз. - person frostymarvelous; 06.04.2016
comment
У меня не работает api.model, но работает api.one. Ошибка заключалась в невозможности преобразовать в последовательность. - person frostymarvelous; 07.04.2016
comment
@frostymarvelous о, простите. Это потому, что я работаю с v.9. api.one — устарело в odoo 9. - person Danila Ganchar; 07.04.2016
comment
О ОК. Пытался использовать 9, но были проблемы, поэтому вернулся к 8, так как доступная документация в основном для 8. - person frostymarvelous; 07.04.2016