Добавить поле в окне мастера внутри унаследованного модуля - PullRequest
0 голосов
/ 21 июня 2020

У меня есть мастер с полем m2m, который отображает library.book tree.

В представлении родительского модуля:

<field name='model'>library.return.wizard</field>
<field name='arch' type='xml'>
    <form string="Return books">
        <sheet>
            <group>
                <field name='book_ids'>
                    <tree>
                        <field name="name"/>
                        <field name="state"/>
                        <!--How to add date_return field here?-->
                        <!--<field name="date_return"/>-->
                    </tree>
                </field>
            </group>
        </sheet>
    </form>
</field>

Другая модель модуля наследует library.book и добавляет поле date_return .

class LibraryBook(models.Model):
    _inherit = 'library.book'

    date_return = fields.Date('Date to return')

Я попытался добавить поле date_return в окно мастера, как это, в вид дочернего модуля:

<field name='model'>library.return.wizard</field>
<field name='arch' type='xml'>
    <field name='book_ids' position="inside">
        <tree>
            <xpath expr="field[@name='state']" position="after">
                <field name="date_return" />
            </xpath>
        </tree>
    </field>
</field>

Это не работает. Как правильно указать его в представлении?

Опять же, у меня есть модуль, который наследует модель поля m2m, и добавляю туда поле, но я не могу его получить.

ОБНОВЛЕНИЕ 22 июня:

inherit_id определенно помогло. Родительская запись - <record id='library_return_wizard_form' model='ir.ui.view'>, поэтому мое дочернее представление использует <field name="inherit_id" ref="my_library.library_return_wizard_form"/>.

Когда я использую только локатор элементов, единственный столбец, отображаемый в виджете-дереве, - state.

<record id='library_return_wizard_form_add' model='ir.ui.view'>
    <field name='name'>library.return.wizard.form.view.add</field>
    <field name='model'>library.return.wizard</field>
    <field name="inherit_id" ref="my_library.library_return_wizard_form"/>
    <field name='arch' type='xml'>
        <field name='book_ids' position="inside">
            <tree>
                <field name="state" position="after">
                    <field name="date_return"/>
                </field>
            </tree>
        </field>
    </field>
</record>

Если я попытаюсь выполнить go с помощью xpath, появится ошибка интерфейса js.

<record id='library_return_wizard_form_add' model='ir.ui.view'>
    <field name='name'>library.return.wizard.form.view.add</field>
    <field name='model'>library.return.wizard</field>
    <field name="inherit_id" ref="my_library.library_return_wizard_form"/>
    <field name='arch' type='xml'>
        <field name='book_ids' position="inside">
            <tree>
                <xpath expr="//field[@name='book_ids']/tree/field[@name='state']" position="after">
                    <field name="date_return" />
                </xpath>
            </tree>
        </field>
    </field>
</record>

Может быть, просто может быть, поле не найдено с этим xpath, но я сомневаюсь в этом.

Полная ошибка:

TypeError: Cannot read property 'type' of undefined
    at Class._renderBodyCell (http://localhost:8069/web/static/src/js/views/list/list_renderer.js:317:55)
    at http://localhost:8069/web/static/src/js/views/list/list_renderer.js:593:25
    at Function._.map._.collect (http://localhost:8069/web/static/lib/underscore/underscore.js:164:24)
    at Class._renderRow [as _super] (http://localhost:8069/web/static/src/js/views/list/list_renderer.js:592:24)
    at Class._renderRow (http://localhost:8069/web/static/src/js/views/list/list_editable_renderer.js:566:32)
    at Class._renderRow (http://localhost:8069/web/static/src/js/core/class.js:123:38)
    at Function._.map._.collect (http://localhost:8069/web/static/lib/underscore/underscore.js:164:24)
    at Class._renderRows (http://localhost:8069/web/static/src/js/views/list/list_renderer.js:614:18)
    at Class._renderRows (http://localhost:8069/web/static/src/js/views/list/list_editable_renderer.js:588:26)
    at Class._renderRows (http://localhost:8069/web/static/src/js/core/class.js:123:38)

В list_renderer. js xpath файла node имеет все его атрибуты, кроме expr undefined.

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

Мне следовало удалить также эти несколько элементов, которые я не заметил после того, как слишком долго смотрел на этот файл. Локатор или xpath надо было поместить прямо в arch.

<field name='book_ids' position="inside">
            <tree>

1 Ответ

2 голосов
/ 21 июня 2020

Вы должны использовать поле inherit_id для указания родительского представления текущего представления, по умолчанию оно не установлено.

Вы пытаетесь найти поле с именем book_ids и добавить к нему дерево в котором есть выражение XPath для поиска поля state. Правильный способ - найти поле состояния и использовать атрибут позиции, чтобы указать, как должен быть изменен согласованный узел.

<record id="view_library_return_wizard_form" model="ir.ui.view">
    <field name="name">library.return.wizard.form.inherit</field>
    <field name="model">library.return.wizard</field>
    <field name="inherit_id" ref="MODULE_NAME.FORM_VIEW_ID"/>
    <field name="arch" type="xml">
        <xpath expr="//field[@name='book_ids']/tree/field[@name='state']" position="after">
            <field name="date_return"/>
        </xpath>
    </field>
</record>

При использовании локатора элементов Odoo попытается найти первый совпадающий элемент. Вы можете использовать локатор полей для упрощения синтаксиса (если есть только одно поле state или вам нужно найти первое).

<record id="view_library_return_wizard_form" model="ir.ui.view">
    <field name="name">library.return.wizard.form.inherit</field>
    <field name="model">library.return.wizard</field>
    <field name="inherit_id" ref="MODULE_NAME.FORM_VIEW_ID"/>
    <field name="arch" type="xml">
        <field name="state" position="after">
            <field name="date_return"/>
        </field>
    </field>
</record> 

EDIT: :

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

У вас есть просто для включения в представление одного из следующих выражений arch

xpath :

<xpath expr="//field[@name='book_ids']/tree/field[@name='state']" position="after">
    <field name="date_return"/>
</xpath>

поле :

<field name="state" position="after">
    <field name="date_return"/>
</field>
...