2014-12-05 138 views
1

我有一個從外部數據庫讀取的TransientModel,因此我創建了帶有功能字段的模型,並且還聲明瞭搜索功能。openerp搜索視圖隱藏

這是部分列聲明:

_columns = { 
     'web_id': fields.function(_get_data, string='ID', fnct_search=_search_data, type='integer', method=True, multi='external'), 
..... 
    } 

樹視圖的操作是

<record id="action_preview_orders" model="ir.actions.act_window"> 
    <field name="name">Preview Orders</field> 
    <field name="type">ir.actions.act_window</field> 
    <field name="res_model">external.data</field> 
    <field name="view_type">tree</field> 
    <field name="view_mode">tree</field> 
    <field name="view_id" ref="preview_orders_view"/> 
    <field name="target">current</field> 
    <field name="search_view_id" ref="preview_orders_view_filters"/> 
</record> 

和搜索的觀點是

<record id="preview_orders_view_filters" model="ir.ui.view"> 
    <field name="name">Preview Filters</field> 
    <field name="model">external.data</field> 
    <field name="arch" type="xml"> 
     <search string="Search Orders"> 
    <filter string="Type" icon="terp-accessories-archiver" domain="[('type_order','=','RO')]"/> 
     </search> 
    </field> 
</record> 

數據顯示正確,我問題是搜索表單不顯示。 它存在html中,但div有style = display:hidden

我可能做錯了什麼?

我增加了獲取數據功能的問題,它是高度動態的。 我不知道這可能是一個問題......

def _get_data(self, cr, uid, ids, field_names, arg, context=None): 
    res = dict.fromkeys(ids) 
    for k in ids: 
     res[k] = dict.fromkeys(self._mapper.keys()) 
     for mk in self._mapper.keys(): 
      fmt = self._mapper[mk].get('format', None) 
      fnc = self._mapper[mk].get('function', None) 
      params = self._mapper[mk].get('parameters', None) 
      if params != None: 
       indexes = [INDEXES[param] for param in params] 
       values = [self._rows[k][index] for index in indexes] 
       if fmt != None: 
        res[k][mk] = fmt.format(*values) 
       elif fnc != None: 
        res[k][mk] = fnc(self, cr, uid, *values) 
       else: 
        res[k][mk] = "" 
      else: 
       res[k][mk] = "" 
    return res 

搜索功能是一個虛擬的一個:

def _search_data(self, cr, uid, obj, name, args, context): 
     return [('id','in',[0])] 

回答

1

您需要創建功能_search_data (用於fnct_search = _search_data)

def _get_full_name(self, cr, uid, ids, field, arg, context=None): 
    res = {} 
    for g in self.browse(cr, uid, ids, context): 
     if g.category_id: 
      res[g.id] = '%s/%s' % (g.category_id.name, g.name) 
     else: 
      res[g.id] = g.name 
    return res 

def _search_group(self, cr, uid, obj, name, args, context=None): 
    operand = args[0][2] 
    operator = args[0][1] 
    lst = True 
    if isinstance(operand, bool): 
     domains = [[('name', operator, operand)], [('category_id.name', operator, operand)]] 
     if operator in expression.NEGATIVE_TERM_OPERATORS == (not operand): 
      return expression.AND(domains) 
     else: 
      return expression.OR(domains) 
    if isinstance(operand, basestring): 
     lst = False 
     operand = [operand] 
    where = [] 
    for group in operand: 
     values = filter(bool, group.split('/')) 
     group_name = values.pop().strip() 
     category_name = values and '/'.join(values).strip() or group_name 
     group_domain = [('name', operator, lst and [group_name] or group_name)] 
     category_domain = [('category_id.name', operator, lst and [category_name] or category_name)] 
     if operator in expression.NEGATIVE_TERM_OPERATORS and not values: 
      category_domain = expression.OR([category_domain, [('category_id', '=', False)]]) 
     if (operator in expression.NEGATIVE_TERM_OPERATORS) == (not values): 
      sub_where = expression.AND([group_domain, category_domain]) 
     else: 
      sub_where = expression.OR([group_domain, category_domain]) 
     if operator in expression.NEGATIVE_TERM_OPERATORS: 
      where = expression.AND([where, sub_where]) 
     else: 
      where = expression.OR([where, sub_where]) 
    return where 

_columns = { 
    'full_name': fields.function(_get_full_name, type='char', string='Group Name', fnct_search=_search_group), 
} 

在res.groups表檢查出全名

+0

我已經做了一個,一個虛擬的同一個功能領域:高清_search_data(個體經營,CR,UID,OBJ,名稱args上下文): 回報[( 'id','in',[0])] – 2014-12-11 10:51:23

+0

你必須根據你的搜索數據使用它數據是沒有存儲在表中,所以你需要從相應的表中獲取數據進行搜索也發佈你的_get_data在這裏更好地理解 – senthilnathang 2014-12-11 12:00:46

+0

我把它添加到我原來的帖子 – 2014-12-12 13:55:28

0
def _get_full_name(self, cr, uid, ids, field, arg, context=None): 
    res = {} 
    for g in self.browse(cr, uid, ids, context): 
     if g.partner_id.new_ic_number: 
      res[g.id] = g.partner_id.new_ic_number 
     elif g.partner_id.old_ic_number: 
      res[g.id] = g.partner_id.old_ic_number 
      #~ res[g.id] = '%s/%s' % (g.category_id.name, g.name) 
     else: 
      res[g.id] = '' 
    return res 

def _search_customer_ic(self, cr, uid, obj, name, args, context=None): 
    ids = set() 
    partner_obj = self.pool.get('res.partner') 
    partner_ids1 = partner_obj.search(cr,uid,[('new_ic_number','ilike',args[0][2])]) 
    partner_ids2 = partner_obj.search(cr,uid,[('old_ic_number','ilike',args[0][2])]) 
    partner_ids = partner_ids1+partner_ids2 
    partner_ids = list(set(partner_ids)) 
    agreement_ids = self.search(cr,uid,[('partner_id','in',partner_ids)]) 
    return [('id','in',agreement_ids)] 
_columns = { 
'ic_number':fields.function(_get_full_name, type='char', string='Customer IC', fnct_search=_search_customer_ic), 
    } 

這是做中檢索在協議表,其中我們PARTNER_ID(定製表),並沒有身份證號碼customer_ic號基於搜索示例代碼,所以我從res.partnerold_ic_number或new_ic_number檢索數據搜索方法在協議表搜索