Добавляем новое поле в модель данных Odoo

Не самый удобный, но самый правильный вариант изменения моделей в Odoo — через модули. Добавить или изменить новое поле в выбранную модель можно при помощи несложного кода:

class Partner(models.Model):
    _inherit = 'res.partner'
    year_of_birth = fields.Integer(string='Год рождения')

На примере выше, мы добавили поле «Год рождения» в модель res.partner. Далее, настроим отображение этого поля в интерфейсе. Для этого, в папке views нашего модуля создадим файл res_partner.xml:

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_partner_form_inherit" model="ir.ui.view">
    <field name="name">res.partner.form</field>
    <field name="model">res.partner</field>
    <field name="inherit_id" ref="base.view_partner_form"/>
    <field name="arch" type="xml">
       <xpath expr="//group/group/field[@name='name']" position="after">
            <field name="year_of_birth"/>
        </xpath>
    </field>
</record>
</odoo>

В примере выше, мы отобразили поле year_of_birth в карточке контакта. Оно будет расположено после поля name.

Не забываем подключить новый xml файл в __manifest__.py. После этих несложных изменений, мы получим новое поле в модели и его отображение в интерфейсе.

Есть несколько моментов, с которыми мне пришлось повозиться. Ниже расскажу как раз о сложностях, которые были.

Необходимо перезапустить Odoo, если вносите изменения в файлы .py. Нужно обновить модуль, если вы вносите изменения в XML. Если вы добавляете или удаляете поля в модели или создаете новую модель, нужно сделать оба действия.

Отображение несуществующего поля модели

Ошибка: ‘View error’, u»Can’t find field ‘year_of_birth‘ in the following view parts composing the view of object model ‘res.partner

Для добавления новых полей в модель, которая загружается вместе со стартом Odoo, нужно переустанавливать модуль. Это не всегда удобно, так как теряются все данные, связанные с расширенными или измененными полями. Чтобы обойти это ограничение, нужно сделать ряд действий:

  1. удаляем новое поле из отображения (xml файл),
  2. перезагружаем сервер или сервис/докер контейнер. Зависит от того, как установлен Odoo,
  3. Переходим на страницу приложений и обновляем модуль.
  4. Проверяем, что новое поле создано в нужной модели. Для этого, в режиме разработчика переходим в Технические настройки — Модели.Смотрим нужную нам модель.
  5. Редактируем отображение (xml файл) и обновляем файл. Проблем с отображением несуществующего поля модели не будет.

Модуль не отображается

Типичная ошибка новичка. Вы загрузили модуль, скачанный с Odoo marketplace на сервер, а он не отображается во вкладке с приложениями. Чтобы это исправить:

  • проверьте, что вы смотрите список всех модулей, а не только Apps. Стандартный фильтр должен быть неактивен.
  • Зайдите в режим разработчика, и на странице приложений нажмите на кнопку «Update Apps List»
  • Если это не помогло, проверьте путь папки, в которую вы установили модуль. Скорее всего, в конфигах Odoo путь отличается.