odoo10 many2one字段下拉更多選項時自定義排序方法


背景:

一個many2one字段,在界面上下拉選值的時候,有一個打開彈窗選擇的頁面,有時候需要對這個數據排序,方便用戶使用。

思路:

需要搞清楚的一點就是:點擊這個many2one字段,默認會發送一個search_read請求,我們需要做的就是在這個過程中傳遞一個消息告訴odoo到這個位置了,需要排序了。當然,這個消息的發送,就可以用conext來傳遞。

實現:

在xml中對應的字段中設置conetxt

<field name="budget_item_id" context="{'budget_item_order': True}"/>

這里給預算項目字段一個上下文:budget_item_orderTrue

然后在對應模型的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)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM