Skip to main content
 首页 » 编程设计

python之Odoo常规设置中的添加

2025年05月04日15Free-Thinker

我正在编写自定义 Odoo 模块,具有一些可以由用户设置的配置。 我想在
中添加一些设置 设置 -> 配置 -> 常规设置

因此,我创建了一个 .py 包含:

from openerp.osv import fields, osv 
 
class mymodule_configuration(osv.osv_memory): 
   _inherit = 'res.config.settings' 
 
  'test_field': fields.char( 
                       string='Test Field', 
                       required=True, 
                             ) 

.XML

<record id="custom_id" model="ir.ui.view"> 
   <field name="name">General Settings</field> 
   <field name="model">res.config.settings</field> 
   <field name="arch" type="xml"> 
      <form string="General"> 
         <field name="test_field"/> 
      </form> 
   </field> 
</record> 

它不会更改常规设置。

如果我像这样添加引用 ID:

<field name="inherit_id" ref="base_setup.view_general_configuration"/> 

然后我得到了错误

ParseError: "ValidateError Field(s) arch failed against a constraint: Invalid view definition

Error details: Field module_portal does not exist

谁能帮我解决这个问题?

请您参考如下方法:

在 Odoo 中定义自定义设置

不幸的是,Odoo 文档似乎没有包含任何关于向 Odoo 添加新配置选项的信息。因此,让我们填补空白。

定义模型

首先,你需要定义一个继承自res.config.settings的新模型:

class YourSettings(models.TransientModel): 
    _inherit = 'res.config.settings' 
    _name = 'your.config.settings' 

这是一个 TransientModel,也称为向导。不要指望它会永久保存这些值。 TransientModels 本质上仅临时存储值。您需要其他方法来使它们永久化。

幸运的是 res.config.settings 让这变得简单。首先,您需要向您的 TransientModel 添加一些字段 - 一个用于您要定义的每个设置选项。 Odoo 内置支持四种不同的设置。它根据字段名称区分它们。

“默认”设置

名为 default_foo 的字段的值将被设置为作为 default_model 给出的模型上名为 foo 的字段的默认值争论。

class YourSettings(models.TransientModel): 
    _inherit = 'res.config.settings' 
    _name = 'your.config.settings' 
 
    default_name = fields.Char(default_model='your.other.model') 

这将使 default_name 字段的值成为模型 your.other.model 中字段 name 的全局默认值。

“群组”设置

名为 group_foo 的 bool 字段有两个参数:group(默认为 base.group_user)和 implied_group。如果该字段的值为 true,group 中定义的组将获得所有 implied_group 的权限。这与将一个组添加到另一个组对象的 implied_ids 字段完全相同(据我所知,这也是一个未记录的功能)。这对于控制哪些用户组可以访问某项功能很有用。

class YourSettings(models.TransientModel): 
    _inherit = 'res.config.settings' 
    _name = 'your.config.settings' 
 
    group_kill = fields.Boolean( 
        group='your.secret_agents', 
        implied_group='your.licence_to_kill' 
    ) 

“模块”设置

名为 module_foo 的 bool 字段,启用后将触发名为 foo 的模块的安装。

class YourSettings(models.TransientModel): 
    _inherit = 'res.config.settings' 
    _name = 'your.config.settings' 
 
    # if enabled will install "spies" module 
    module_spies = fields.Boolean() 

其他设置

默认情况下,其他字段的值将被丢弃,但您可以通过实现自己的保存方式来更改它。只需定义一个名为 set_foo 的方法(其中 foo 是任意字符串)。您还可以使用 get_default_foo 方法设置此类字段的初始值(foo 的确切形式再次无关紧要)。

例如,如果您想使用设置来控制链接到当前用户的公司的名称和电话号码:

class YourSettings(models.TransientModel): 
    _inherit = 'res.config.settings' 
    _name = 'your.config.settings' 
 
    company_name = fields.Char() 
    company_phone = fields.Char() 
 
    @api.model 
    def get_default_company_values(self, fields): 
    """ 
    Method argument "fields" is a list of names 
    of all available fields. 
    """ 
        company = self.env.user.company_id 
        return { 
            'company_name': company.name, 
            'company_phone': company.phone, 
        } 
 
    @api.one 
    def set_company_values(self): 
        company = self.env.user.company_id 
        company.name = self.company_name 
        company.phone = self.company_phone 

定义 View

然后您只需要为您的设置定义一个 View 。让我们使用前面的示例:

<record id="your_configuration" model="ir.ui.view"> 
    <field name="name">Your configuration</field> 
    <field name="model">your.config.settings</field> 
    <field name="arch" type="xml"> 
        <form string="Your configuration" class="oe_form_configuration"> 
            <header> 
                <button string="Save" type="object" 
                    name="execute" class="oe_highlight"/> 
                or 
                <button string="Cancel" type="object" 
                    name="cancel" class="oe_link"/> 
            </header> 
            <group string="Company"> 
                <label for="id" string="Name &amp; Phone"/> 
                <div> 
                    <div> 
                        <label for="company_name"/> 
                        <field name="company_name"/> 
                    </div> 
                    <div> 
                        <label for="company_phone"/> 
                        <field name="company_phone"/> 
                    </div> 
                </div> 
            </group> 
        </form> 
    </field> 
</record> 
 
<record id="your_settings_action" model="ir.actions.act_window"> 
    <field name="name">Your configuration</field> 
    <field name="res_model">your.config.settings</field> 
    <field name="view_id" ref="your_configuration"/> 
    <field name="view_mode">form</field> 
    <field name="target">inline</field> 
</record> 

当然不要忘记在设置菜单中创建一个新条目:

<menuitem id="your_settings_menu" name="Your settings" 
    parent="base.menu_config" action="your_settings_action"/> 

引用:http://ludwiktrammer.github.io/odoo/custom-settings-odoo.html