【问题标题】:i can't add select options to an existing selection field odoo 15我无法将选择选项添加到现有的选择字段odoo 15
【发布时间】:2022-11-12 06:56:46
【问题描述】:

我已经声明了两个选择字段

 x = fields.Selection([('x A','x A'),('x B','x B')],string='X')
 y = fields.Selection([('0','0')],string='Y')

然后我尝试将选择选项添加到是的场上改变

 @api.onchange('x')
    def onchange_x(self):
        self.y = fields.Selection(selection_add = [('y A', 'y A'),('y B', 'y B')])

当我从 x 选择中选择时,我收到此错误

Traceback(最近一次调用最后一次):文件 “/opt/odoo/odoo/addons/base/models/ir_http.py”,第 237 行,在 _dispatch 结果 = request.dispatch() 文件“/opt/odoo/odoo/http.py”,第 687 行,在调度中 结果 = self._call_function(**self.params) 文件“/opt/odoo/odoo/http.py”,第 359 行,在 _call_function return checked_call(self.db, *args, **kwargs) File "/opt/odoo/odoo/service/model.py", line 94, in wrapper return f(dbname, *args, **kwargs) File "/opt/odoo/odoo/http.py", line 348, in checked_call 结果 = self.endpoint(*a, **kw) 文件“/opt/odoo/odoo/http.py”,第 916 行,在称呼return self.method(*args, **kw) 文件“/opt/odoo/odoo/http.py”,第 535 行,在 response_wrap 响应 = f(*args, **kw) 文件“/opt/odoo/addons/web/controllers/main.py”,第 1346 行,在 call_button action = self._call_kw(model, method, args, kwargs) 文件“/opt/odoo/addons/web/controllers/main.py”,第 1334 行,在 _call_kw return call_kw(request.env[model], method, args, kwargs) File "/opt/odoo/odoo/api.py", line 464, in call_kw 结果 = _call_kw_multi(method, model, args, kwargs) 文件“/opt/odoo/odoo/api.py”,第 451 行,在 _call_kw_multi 结果 = 方法(recs,*args,**kwargs)文件“/opt/odoo/custom-addons/om_x/models/employee.py”,第 34 行,在 测试函数 self.em_pole = fields.Selection(selection_add=[('Pole A', 'Pole A'), ('Pole B', 'Pole B')], string='Pole') 文件 “/opt/odoo/odoo/fields.py”,第 1217 行,在records.write({self.name: write_value}) 文件“/opt/odoo/addons/hr/models/hr_employee.py”,第 317 行,写入 res = super(HrEmployeePrivate, self).write(vals) 文件“/opt/odoo/addons/mail/models/mail_thread.py”,第 323 行,写入 结果 = super(MailThread, self).write(values) 文件“/opt/odoo/addons/mail/models/mail_activity_mixin.py”,第 243 行,在 写 return super(MailActivityMixin, self).write(vals) File "/opt/odoo/odoo/models.py", line 3858, in write field.write(self, value) 文件“/opt/odoo/odoo/fields.py”,第 1015 行,写入 cache_value = self.convert_to_cache(value, records) 文件“/opt/odoo/odoo/fields.py”,第 2534 行,在 convert_to_cache raise ValueError("%s 的错误值:%r" % (self, value)) 异常

上述异常是以下异常的直接原因:

Traceback(最近一次调用最后一次):文件“/opt/odoo/odoo/http.py”, 第 643 行,在 _handle_exception 中 return super(JsonRequest, self)._handle_exception(exception) 文件“/opt/odoo/odoo/http.py”,第 301 行,在 _handle_exception 从 new_cause ValueError 引发 exception.with_traceback(None):hr.employee.y 的值错误:<odoo.fields.Selection>

你能帮我吗 。

【问题讨论】:

  • 这在 Odoo 中是不可能的,请在 One2many 字段中尝试
  • 你能解释更多吗?
  • 怎么做 ??

标签: python xml odoo odoo-15


【解决方案1】:

您永远不应该在运行时更改选择数组。 选择字段的选择数组应始终是静态的。 这是因为 odoo 在安装模块后在后台运行一些迁移,创建一个支持 postgresql 表来存储选择选项。

如果不同的模块或模型需要它们,您可以增加(使用 selection_add)它的选项,但仍然不在运行时。为此,您需要首先继承各自的模型,然后使用 selection_add 参数重新定义字段。

module_1/models/my_model.py:

class MyModel(models.Model):
  _name = "my.model"
  
  my_selection = fields.Selection(
    selection=[('a', 'A')]
    string="My Selection"
  )

module_2/models/my_model.py:

class MyModel(models.Model):
  _inherit = "my.model"
  
  my_selection = fields.Selection(
    selection_add=[('b', 'B')]
    string="My Selection"
  )

对于运行时更新,您需要使用具有适当域的 Many2one 字段,然后可以通过onchange decorator 对其进行修补。

class MyOption(models.Model):
  _name = "my.option"
  
  name = fields.Char()
  filtered = fields.Boolean(default=False)

class MyModel(models.Model):
  _name = "my.model"

  show_filtered_options = fields.Boolean(default=False)
  option_id = fields.Many2one(
    comodel_name="my.option",
    domain="[('filtered', '=', show_filtered_options)]"
  )

  @api.onchange('show_filtered_options')
  def _onchange_show_filtered_options(self):
    self.ensure_one()

    return {'domain': {
        'option_id': [('filtered', '=', self.show_filtered_options)]
      }
    }

最后,使用数据 XML 文件填充您的选项。 请记住将其附加到模块清单内的“数据”数组中。

<odoo>
  <data>
    <record name="my_option_1" model="my.option">
      <field name="name">Option 1</field>
      <field name="filtered">0</field>
    </record>

    <record name="my_option_2" model="my.option">
      <field name="name">Option 2</field>
      <field name="filtered">1</field>
    </record>
  </data>
</odoo>

要在 Many2one 中复制选择字段行为,您可以在视图中添加 widget="selection"

&lt;field name="option_id" widget="selection" /&gt;

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多