Что представляет собой опция получения представления полей в меню разработчика Odoo 11?

Я пытаюсь отладить модуль, используя режим разработчика и меню, которое можно открыть с помощью символа ошибки. В меню есть пункт «Редактировать вид формы», который очень удобен, если вы хотите посмотреть исходный код форм. Также есть пункт меню «Fields view get», который показывает ту же форму немного по-другому.

Не понимаю, откуда берутся лишние предметы. В определении поля есть несколько дополнительных атрибутов, и часто есть модификаторы элемента = "{...}".

Откуда берутся эти дополнительные атрибуты?

Пример кода из формы, определяющей партнера:

просмотр полей получить

<form string="Partner" modifiers="{}">
<sheet modifiers="{}">
    <div class="oe_button_box" name="button_box" modifiers="{}">
        <button class="oe_stat_button o_res_partner_tip_opp" type="action" attrs="{'invisible': [('customer', '=', False)]}" name="273" icon="fa-star" context="{'search_default_partner_id': active_id}" modifiers="{'invisible':[['customer','=',false]]}" options="{}">
            <field string="Verkaufschancen" name="opportunity_count" widget="statinfo" modifiers="{'readonly':true}"/>
        </button>

изменить вид формы

<form string="Partners">
            <sheet>
                <div class="oe_button_box" name="button_box">
                    <button name="toggle_active" type="object" class="oe_stat_button" icon="fa-archive">
                        <field name="active" widget="boolean_button" options="{&quot;terminology&quot;: &quot;archive&quot;}"/>
                    </button>

person thopy    schedule 22.02.2019    source источник


Ответы (1)


О полях view_get

Каждая модель Odoo имеет fields_view_get метод, который вы можете перезаписать. этот метод выполняется после загрузки XML-кода представления и перед его преобразованием в HTML. Это означает, что вы можете вносить некоторые динамические изменения в представления. Ищите def fields_view_get в модулях Odoo, вы найдете множество кейсов. Пример:

@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False,
                    submenu=False):
    result = super(AccountMoveLine, self).fields_view_get(view_id,
                                                          view_type,
                                                          toolbar=toolbar,
                                                          submenu=submenu)

    doc = etree.XML(result['arch'])
    if view_type == 'tree' and self._module == 'account_payment_order':
        if not doc.xpath("//field[@name='balance']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'balance',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addprevious(elem)
        if not doc.xpath("//field[@name='amount_residual_currency']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'amount_residual_currency',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addnext(elem)
        if not doc.xpath("//field[@name='amount_residual']"):
            for placeholder in doc.xpath(
                    "//field[@name='amount_currency']"):
                elem = etree.Element(
                    'field', {
                        'name': 'amount_residual',
                        'readonly': 'True'
                    })
                orm.setup_modifiers(elem)
                placeholder.addnext(elem)
        # Remove credit and debit data - which is irrelevant in this case
        for elem in doc.xpath("//field[@name='debit']"):
            doc.remove(elem)
        for elem in doc.xpath("//field[@name='credit']"):
            doc.remove(elem)
        result['arch'] = etree.tostring(doc)
    return result

О модификаторах

Модификаторы предназначены для замены attrs и других атрибутов (readonly, required, invisible). На данный момент они существуют вместе с этими атрибутами. Причина их введения в том, чтобы упростить работу нового веб-клиента, чтобы он мог смотреть только в одном месте. Также оценка modifiers будет происходить на стороне сервера, при этом отпадает необходимость в интерпретаторе python (-подобного) на стороне клиента. Наконец, модификаторы конкретного синтаксиса будут json (информация взята из https://answers.launchpad.net/openobject-server/+question/168924).

Заключение

Таким образом, отвечая на ваш вопрос, то, что вы видите в представлении редактирования формы, является чистым XML-кодом представления, таким же, как вы увидите в XML-файлах модулей Odoo, тогда как представление полей get - это код после загрузки и преобразования для отображения на стороне клиента.

person forvas    schedule 22.02.2019
comment
Спасибо, что проливает свет на это. Означает ли это, что каждый модификатор слова, который я вижу в представлении полей, можно получить только путем переопределения функции, и каждый дополнительный атрибут, который я обнаруживаю, создается в другом представлении xml (которое мне нужно найти и наследовать, чтобы переопределить атрибуты)? - person thopy; 24.02.2019
comment
@thopy именно так. Вы можете легко найти добавленные изменения в Edit X View (где X - это форма, дерево, канбан ...) на вкладке Inherited views. Но каждое из этих представлений имеет свою собственную вкладку Унаследованные представления со своими собственными изменениями, поэтому, в зависимости от представления, просмотр всех изменений может занять некоторое время. Кстати, если этот ответ был для вас полезным, отметьте его как полезный или правильный ответ. Спасибо! - person forvas; 25.02.2019