我有一个长很多的列表,并且希望根据用户可能设置的过滤器向用户显示此列表的一个子集。
我的当前方法是使原始的one2many字段具有所有记录,并具有另一个过滤的one2many字段。 我通过从原始列表中选择未过滤的子集来计算过滤后的列表。 此外,我将更改从过滤列表应用于原始列表。因此,我在列表中搜索新记录,并在原始列表中也创建这些记录。我搜索已删除的记录,然后将它们从原始列表中删除。
这种方法实际上有效,但是它需要大量代码,并且仅模仿我对某些Odoo本地功能或可过滤的one2many小部件的期望。
我尝试的所有其他方法都无法使用:
search_default_
值)。我认为不支持。问题是:有没有比我目前的方法更简单的解决方案来过滤具有本地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)
答案 0 :(得分:0)
我用相同的结果尝试了您提到的所有技巧...
下面介绍了我发现的唯一解决方法(非常有效!)
1-您可以在..._ ids字段定义中使用计算 并将所有“过滤的东西”放到def 但“许多”侧的所有行均为只读 (这对我来说是个问题,因为我需要编辑这些行
2-您可以在表格上定义一个新的布尔值字段 在“许多”方面(在您的情况下为“ mymodule.schedule_entry”),然后放入 def中的“过滤内容”。它完美地工作并且线条是可编辑的!