odoo过滤器一个很多列表

时间:2018-07-04 16:45:44

标签: odoo odoo-11

我有一个长很多的列表,并且希望根据用户可能设置的过滤器向用户显示此列表的一个子集。

我的当前方法是使原始的one2many字段具有所有记录,并具有另一个过滤的one2many字段。 我通过从原始列表中选择未过滤的子集来计算过滤后的列表。 此外,我将更改从过滤列表应用于原始列表。因此,我在列表中搜索新记录,并在原始列表中也创建这些记录。我搜索已删除的记录,然后将它们从原始列表中删除。

这种方法实际上有效,但是它需要大量代码,并且仅模仿我对某些Odoo本地功能或可过滤的one2many小部件的期望。

我尝试的所有其他方法都无法使用:

  • 无法在多个列表中搜索(例如,在上下文中设置search_default_值)。我认为不支持。
  • 使用域过滤第二个one2many列表不起作用(在xml和python代码中均无效)。我认为Odoo只允许这个数目很多。
  • 我想通过扩展普通小部件来创建一个可过滤的one2many小部件。但是我不明白列表在js代码中的哪个位置。

问题是:有没有比我目前的方法更简单的解决方案来过滤具有本地Odoo功能的one2many字段? 还是可以用一个定制的one2many小部件的js代码帮助我,以仅显示部分项目?例如,填充列表时调用哪种方法,项目的ID在哪个字段中?

示例

我希望模型中包含以下内容:

# This is the original list, with all entries
schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', 'schedule_id', string="Entries")

# This is the filtered list, to be used in the view
# Note: Sadly using the domain here does not work. It always shows all entries. But I hope you get the idea what I want to accomplish.
filtered_schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', string="Filtered Entries", related='schedule_entry_ids', domain='[("phase_id", "=", filter_phase_id)]')

# This is the field that defines the filter
filter_phase_id =
    fields.Many2one('mymodule.phase', string="Phase Filter")

很难使用域过滤器,因此我目前的方法是“手动”将过滤后的字段创建为计算字段:

filtered_schedule_entry_ids =
    fields.One2many('mymodule.schedule_entry', string="Filtered Entries", compute='_compute_filter', inverse='_inverse_filter')

@api.onchange('filter_phase_id', 'schedule_entry_ids')
def _compute_filter(self):
    # Populate the filtered list with the elements from the original list, for which the filter condition holds

def _inverse_filter(self):
    # Remove elements from the original list if they should be present in the filtered list but aren't anymore (elements have been deleted from the filtered list).
    # For all new elements in the filtered list, create a new element in the original list (elements have been created)

1 个答案:

答案 0 :(得分:0)

我用相同的结果尝试了您提到的所有技巧...

下面介绍了我发现的唯一解决方法(非常有效!)

1-您可以在..._ ids字段定义中使用计算 并将所有“过滤的东西”放到def 但“许多”侧的所有行均为只读 (这对我来说是个问题,因为我需要编辑这些行

2-您可以在表格上定义一个新的布尔值字段 在“许多”方面(在您的情况下为“ mymodule.schedule_entry”),然后放入 def中的“过滤内容”。它完美地工作并且线条是可编辑的!