背景:
一個many2one
字段,在界面上下拉選值的時候,有一個打開彈窗選擇的頁面,有時候需要對這個數據排序,方便用戶使用。
思路:
需要搞清楚的一點就是:點擊這個many2one
字段,默認會發送一個search_read
請求,我們需要做的就是在這個過程中傳遞一個消息告訴odoo到這個位置了,需要排序了。當然,這個消息的發送,就可以用conext來傳遞。
實現:
在xml中對應的字段中設置conetxt
<field name="budget_item_id" context="{'budget_item_order': True}"/>
這里給預算項目字段一個上下文:budget_item_order
為True
然后在對應模型的py文件中編寫search_read方法:
@api.model def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None): # if not domain: # domain = [] # domain += self._get_domains() # if self.env.context.get('budget_control_rule', False): # order = 'code' if self.env.context.get('budget_item_order', False): order = 'order' return super(KthrpBudgetBudgetItem, self).search_read(domain=domain, fields=fields, offset=offset, limit=limit, order=order) 注: 不知道只寫着一個方法會不會生效,下面有全部的方法,不生效嘗試下面的5個方法同時寫 def _get_domains(self): domain = [] if self.env.context.get('budget_control_rule', False): domain += [('company_id', 'in', (False, self.env.user.company_id.id)), ('business_group_id', '=', self.env.user.company_id.business_group_id.id)] budget_category_company = self.env.context.get('budget_category_company', False) if budget_category_company: company_id = budget_category_company[1] business_group_id = budget_category_company[0] if company_id: domain += [('company_id', 'in', (company_id, False))] else: domain += [('business_group_id', '=', business_group_id)] select_depend_type_id = self.env.context.get('select_depend_type_id',False) if select_depend_type_id: budget_item_ids = self.env['kthrp.budget.budget.sheet.document.type'].browse(select_depend_type_id).budget_item_ids.ids if budget_item_ids: domain += [('id','in', budget_item_ids)] return domain @api.model def name_search(self, name, args=None, operator='ilike', limit=100): args = args or [] domain = self._get_domains() return super(KthrpBudgetBudgetItem, self).name_search(name, args=args + domain, operator=operator, limit=limit) ######################################################################################## @api.model def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None): if not domain: domain = [] domain += self._get_domains() if self.env.context.get('budget_control_rule', False): order = 'code' elif self.env.context.get('budget_item_order', False): order = 'order' return super(KthrpBudgetBudgetItem, self).search_read(domain=domain, fields=fields, offset=offset, limit=limit, order=order) ######################################################################################### @api.model def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True): if not domain: domain = [] domain += self._get_domains() return super(KthrpBudgetBudgetItem, self).read_group(domain=domain, fields=fields, groupby=groupby, offset=offset, limit=limit, orderby=orderby, lazy=lazy) @api.model def search_count(self, args): domain = args or [] domain += self._get_domains() return super(KthrpBudgetBudgetItem, self).search_count(domain)