odoo fields_view_get
odoo fields_view_get 방법 은 비교적 유용 하고 유연 하 며 광범 위 하 다. 만약 에 적절하게 사용 하면 일반적인 방법 으로 실현 할 수 없 는 기능 을 할 수 있다. 본 고 는 몇 가지 용법 을 열거한다.
openerp 의 보기 구 조 는 XML 형식 으로 ir. ui. view 표 에 저장 되 며 정적 형식 에 속 하 며 디자인 후 고정 되 어 있 습 니 다.
하지만 model 에서 fields 를 다시 쓸 수 있 습 니 다.view_get 함수, 보기 불 러 올 때 arch 속성 을 수정 하고 보기 의 구 조 를 동적 으로 수정 합 니 다.
Odoo 개발 에 서 는 이러한 수요 가 자주 발생 하 는데 대상 에 조건 에 따라 필드 를 표시 할 지 여부 입 니 다.예 를 들 어 창설 자가 아니라면 고객 의 연락 처 를 표시 하지 않 고 Odoo 에서 어떻게 실현 합 니까?domain 은 odoo 에서 대상 필드 의 값 이나 관계 에 따라 필드 를 표시 할 지 여 부 를 확인 할 수 있 습 니 다.
동적 domain 의 예 는 선택 구조 에 따라 필드 가 표시 되 는 지 여 부 를 확인 합 니 다.view 에서 states 의 값 에 따라 필드 가 표시 되 는 지 여 부 를 확인 할 수 있 는 방법 도 있다.
view 의 state
동적 보기
사용법 field 속성 수정:
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): #override of fields_view_get in order to replace the name field to product template if context is None: context={} res = super(product_product, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu) #check the current user in group_product_variant group_id = self.pool['ir.model.data'].get_object_reference(cr, uid, 'product', 'group_product_variant')[1] obj = self.pool.get('res.groups').browse(cr, uid, group_id, context=context) doc = etree.XML(res['arch']) if view_type == 'form': if obj and uid in [x.id for x in obj.users]: for node in doc.xpath("//field[@name='name']"): node.set('invisible', '1') node.set('required', '0') setup_modifiers(node, res['fields']['name']) # for node in doc.xpath("//label[@string='Product Name']"): node.set('string','Product Template') else: for node in doc.xpath("//field[@name='product_tmpl_id']"): node.set('required','0') setup_modifiers(node, res['fields']['product_tmpl_id']) # for node in doc.xpath("//field[@name='name']"): node.set('invisible', '0') setup_modifiers(node, res['fields']['name']) # for node in doc.xpath("//label[@string='Product Template']"): node.set('string','Product Name') res['arch'] = etree.tostring(doc) return res
1
def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if context is None:context = {} res = super(rhwl_gene, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar,submenu=False) if res['type']=="form": id = res['id'] // id , if : doc = etree.XML(res['arch']) doc.xpath("//form")[0].set("edit","false") res['arch']=etree.tostring(doc) return res
2
def fields_view_get(self, cr, uid, view_id=None,view_type='form',context=None,toolbar=False,submenu=False): ip_obj = self.pool.get('hr.rule.input') res = super(hr_inputs_editor,self).fields_view_get(cr,uid,view_id,view_type,context,toolbar,submenu) if view_type=='form': treev = res['fields']['line_ids']['views']['tree'] doc = etree.XML(treev['arch']) for node in doc.xpath("/tree/field"): name = node.get('name',False) if name.startswith('value'): name = name.replace('value','input') + '_code' cd = context.has_key(name) and context[name] or False if cd: ip_ids = ip_obj.search(cr,uid,[('code','=',cd)],limit=1,context=context) if ip_ids: text = ip_obj.read(cr,uid,ip_ids,['name'])[0]['name'] node.set('string',text) else: node.set('modifiers','{"tree_invisible":true}') treev['arch'] = etree.tostring(doc) return res
용법 2. 조건 에 따라 view 를 편집 할 수 있 는 지 여 부 를 제한 합 니 다.
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): if view_type == 'form': res['arch'] = self.fields_view_get_address(res['arch']) record = self.env['crm.lead'].browse(self._context.get('params').get('id')) # restrict modification and deletion of child ids if record.parent_id: res['arch'] = res['arch'][:6] + 'edit="false" delete="false" ' + res['arch'][6:] elif record.stage_id.id == 4: # restrict edition of Purchased Lead res['arch'] = res['arch'][:6] + 'edit="false" ' + res['arch'][6:] return res
용법 3. 보기 의 동적 에 field 를 추가 합 니 다. 아래 코드 는 특정한 보기 의 동적 에 field (product id) 를 추가 하 는 것 입 니 다.
@api.model
def fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False): doc = etree.XML(res['arch']) summary = doc.xpath("//field[@name='product_id']") if len(summary): summary = summary[0] summary.addnext(etree.Element('field', {'name': 'product_id', 'string':'title of new field', 'nolabel':'0', })) res['arch'] = etree.tostring(eview) return res
용법 4. 보기 에 page 를 추가 합 니 다.
class product_product(osv.osv):
_inherit = 'product.product' def fields_view_get(self, view_id=None, view_type='form', toolbar=False,submenu=False): """ Changes the view dynamically @param self: The object pointer. @return: New arch of view. """ ret_val = super(product_product, self).fields_view_get(view_id, view_type, toolbar,submenu) if view_type == 'form': doc = etree.XML(ret_val['arch'], parser=None, base_url=None) # page _moves_arch_lst = """ """ first_node = doc.xpath("//page[@string='Sales']") if first_node and len(first_node)>0: # _moves_arch_lst XML Node, node feature_page = etree.XML(_moves_arch_lst) first_node.addnext(feature_page) ret_val['arch'] = etree.tostring(doc, encoding="utf-8") return ret_val
동적 수정 field domain:
class account_voucher(osv.osv):
_inherit = 'account.voucher' def fields_view_get(self, view_id=None, view_type=False, toolbar=False, submenu=False): """ Add domain 'allow_check_writting = True' on journal_id field and remove 'widget = selection' on the same field because the dynamic domain is not allowed on such widget """ if not context: context = {} res = super(account_voucher, self).fields_view_get(view_id=view_id, view_type=view_type, toolbar=toolbar, submenu=submenu) doc = etree.XML(res['arch']) nodes = doc.xpath("//field[@name='journal_id']") # context (write_check) if context.get('write_check', False) : for node in nodes: # journal_id field domain node.set('domain', "[('type', '=', 'bank'), ('allow_check_writing','=',True),('your_field','=','value')]") # widget , node.set('widget', '') res['arch'] = etree.tostring(doc) return res
: http://www.odoogo.com/post/87/#comment-block
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.