0

我的模型中有一些选择字段。这里的例子:

class MyModel(models.Model):
    _name = 'my_app.my_model'

    example_selection = fields.Selection(
        [
             ('first', 'First'),
             ('second', 'Second'),
             # etc.
        ], 
        string='My selection', 
    )

在某些情况下,我需要在选择(或单选按钮)中隐藏特定选项。我怎样才能正确地做到这一点?

下面是基本日历模块的屏幕,可以更多地解释我的问题。

在此处输入图像描述

提前致谢。

4

3 回答 3

2

有点太晚了。就我而言,我是这样做的:

odoo.define('my_module.custom_selection', function(require) {
"use strict";

var registry = require('web.field_registry');
var relational_fields = require('web.relational_fields');

var MySelection = relational_fields.FieldRadio.extend({
    init: function() {
        this._super.apply(this, arguments);
        // use to decrement in splice, bc position change when element is removed
        let decrement = 0;
        // this.values can be undefined or [[], [], []]
        // copying the content of original array or []
        let value_copies = this.values? [...this.values]: [];
        
        for (let index = 0; index < value_copies.length; index++) {
            // 'other' is the value to be removed
            if (value_copies[index].includes('other')) {
                this.values.splice(index - decrement, 1);
                decrement++;
            }
        }
    },
});

registry.add('custom_selection', MySelection);

return MySelection;
});

你可以在这里查看我的仓库:https ://github.com/m0r7y/wdgt_hide_option

于 2021-01-27T10:57:22.250 回答
1

我找到了解决方案。

首先,我们需要为FieldSelection创建自定义小部件。这里的例子(path_to_your_module/static/src/js/form_widgets.js):

odoo.define('your_module.form_widgets', function (require) {
"use strict";

var core = require('web.core');
var FieldSelection = core.form_widget_registry.get('selection');

var MySelection = FieldSelection.extend({
    // add events to base events of FieldSelection
    events: _.defaults({
        // we will change of visibility on focus of field
        'focus select': 'onFocus'
    }, FieldSelection.prototype.events),
    onFocus: function() {
      if (
          // check values of fields. for example I need to check many fields
          this.field_manager.fields.name_field_1.get_value() == 'value1' &&
          this.field_manager.fields.name_field_2.get_value() == 'value2' /* && etc fields...*/   
      ) {
          // for example just hide all options. You can create any kind of logic here
          this.$el.find('option').hide();
      } 
    }
});

// register your widget
core.form_widget_registry.add('your_selection', MySelection);
});

在此之后,您只需将小部件设置为视图中的字段,如下所示:

<field name="example_selection" widget="your_selection"/>

如果您不知道如何在HERE 示例中包含可以帮助您的模块的静态内容。

我希望这可以帮助别人 ;)

于 2016-02-19T23:47:17.423 回答
0

AFAIK 这是不可能的,但是如果您在可以使用的视图中使用 MAny2one 而不是选择(因此使用域)结束,则可以实现类似的效果

<field name="example_with_domain" widget="selection"/>

获得选择字段的相同视觉行为(不创建,不编辑)。

于 2016-01-28T08:35:25.547 回答