【问题标题】:Field does not exist in model "res.config.settings"模型“res.config.settings”中不存在字段
【发布时间】:2022-01-07 13:50:15
【问题描述】:

我想为自定义 Odoo 模块添加配置。但是,每当我尝试安装模块时,都会收到以下错误。我创建的自定义模型似乎没有被 Odoo 看到。

odoo.exceptions.ValidationError: Error while validating view near:

                            <div class="o_setting_search">
                                <input type="text" class="searchInput pull-right p-0 pb-1" placeholder="Search..."/>
                                <span class="searchIcon"><i class="fa fa-search" role="img" aria-label="Search" title="Search"/></span>
                            </div>
                        </div>

Field "test_field" does not exist in model "res.config.settings"

./models/__init__.py

from . import res_config_settings

./models/res_config_settings.py

from odoo import api, fields, models


class ResConfigSettings(models.TransientModel):
    _inherit = "res.config.settings"
    _name = "test.settings"

    test_field = fields.Char(string="Test Field")

    @api.model
    def get_values(self):
        res = super(ResConfigSettings, self).get_values()
        test_config = self.env.ref('test_config', False)
        test_config and res.update(
            test_field=test_config.test_field,
        )
        return res

    def set_values(self):
        super(ResConfigSettings, self).set_values()
        test_config = self.env.ref('test_config', False)
        test_config and test_config.write({
            'test_field': self.test_field,
        })

views/settings.xml

<?xml version="1.0" encoding="utf-8"?>
<odoo>
  <record id="res_config_settings_view_form" model="ir.ui.view">
    <field name="name">res.config.settings.view.form.inherit.test</field>
    <field name="model">res.config.settings</field>
    <field name="inherit_id" ref="base.res_config_settings_view_form" />
    <field name="arch" type="xml">
      <xpath expr="//div[hasclass('settings')]" position="inside">
        <div
          class="app_settings_block"
          data-string="Abcdefg Test Configuration"
          string="Abcdefg Test Configuration"
          data-key="odoo-abcdefg-test-module"
        >
          <h2>Test Configuration</h2>
          <group>
            <div class="row mt16 o_settings_container">
              <div class="o_setting_left_pane">
                <label for="test_field" string="Test Field"/>
                <field name="test_field"/>
              </div>
            </div>
          </group>
        </div>
      </xpath>
    </field>
  </record>
</odoo>

__init__.py

from . import models

__manifest__.py

{
    "name": "ABCDEFG Test Module",
    "version": "0.1.0",
    "category": "Testing",
    "application": False,
    "installable": True,
    "depends": ["base"],
    "data": [
        "views/settings.xml",
    ],
}

我做错了什么?

【问题讨论】:

    标签: python odoo odoo-15


    【解决方案1】:

    您将_nameinherit 属性组合在一起,这将产生一个名为test.settings 的新模型。它叫做Classical inheritance

    要将test_field 添加到res.config.settings,只需删除_name 属性即可。

    【讨论】:

    • 作为附加信息:在现在非常旧的 Odoo 版本中,创建新的设置模型是正常的。但是随着对一个大设置菜单的重大改变,这种正常变得不再工作了。所以是的,在较新的版本中,只需以扩展方式继承 res.config.settings
    • 嗨。谢谢。从模型中删除_name 属性确实 允许我安装模块而不会出现错误,我什至可以看到设置页面上显示的测试字段文本输入字段。但是,当我填写一个值并单击保存时,该值似乎没有保存,因为当我刷新页面时,该值不再填写在输入字段中。我应该更改模型上的set_values 方法吗?我应该做些什么不同的事情?
    • 你使用config_parameter字段属性
    【解决方案2】:

    试试这个。

    from odoo import api, fields, models
    
    
    class ResConfigSettings(models.TransientModel):
        _inherit = "res.config.settings"
    
        test_field = fields.Char(string="Test Field")
    
        @api.model
        def get_values(self):
            res = super(ResConfigSettings, self).get_values()
            test_config = self.env.ref('test_config', False)
            test_config and res.update(
                test_field=test_config.test_field,
            )
            return res
    
        def set_values(self):
            super(ResConfigSettings, self).set_values()
            test_config = self.env.ref('test_config', False)
            test_config and test_config.write({
                'test_field': self.test_field,
            })

    【讨论】:

    • 您能否详细说明为什么您认为您的解决方案会起作用以及为什么原来的解决方案不起作用?
    • @CZoellner。我想你错过了什么。我是第一个回答的。但我同意他的解决方案。
    • 不,除了解释为什么您的代码示例应该工作之外,我什么都不会错过。我知道这与后面的答案中的解决方案相同,但“试试这个”不足以让我投票赞成一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2020-09-30
    • 2013-07-07
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多