У меня длинный список one2many, и я хочу показать пользователю только его часть, основываясь на фильтрах, которые пользователь может установить.
Мой текущий подход должен иметь исходное поле one2many со всеми записями и другое отфильтрованное поле one2many.
Я вычисляю отфильтрованный список, выбирая подмножество, которое не отфильтровано из исходного списка.
Далее я применяю изменения из отфильтрованного списка к исходному списку. Поэтому я ищу новые записи в списке и создаю их в исходном списке. Я ищу удаленные записи и удаляю их из исходного списка.
На самом деле этот подход работает, но он требует кучу кода и имитирует только то, что я ожидал бы от некоторых нативных функций Odoo или фильтруемого виджета one2many.
К сожалению, все другие подходы Я пытался не работает:
- Поиск в списках one2many не работает (например, установка значений
search_default_
в контексте). Я думаю, что это не поддерживается.
- Использование домена для фильтрации второго списка one2many не работает (ни в xml, ни в коде python). Я думаю, что Odoo позволяет это только для многих.
- Я хотел бы создать фильтруемый виджет one2many, расширяя обычный. Однако я не понимаю, где в коде JS список заполнен.
Итак, вопрос: существует ли более простое решение, чем мой нынешний подход, для фильтрации поля one2many с собственными функциями Odoo?
Или вы можете помочь мне с js-кодом пользовательского виджета one2many, чтобы показывать только подмножество элементов? Например, какой метод вызывается при заполнении списка и в каком поле находятся идентификаторы элементов?
Пример * +1026 *
Я хочу в своей модели что-то вроде следующего:
# 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)