plone - 在编辑表单中时,什么会导致门户目录在自动完成选择字段的源对象中失败?
plone - While in an edit form, what can cause portal catalog to fail in a source object for an autocomplete choice field?
我有一个选择字段的源对象,它是一个自动完成小部件,它依赖于使用门户目录根据用户传入的值查找内容。不幸的是,在查看编辑表单时,portal_catalog 有时 returns 0 结果应该返回 1 结果。
应该返回 1 个结果的函数是 'getTerm'。我做了一个打印语句,看看它得到了多少结果,并确保传入的值是该术语的值。我的 print 语句显示传入的值始终是应有的值,但并不总能找到结果。我不确定为什么这是 'failing',当它在添加表单中工作时。
我的界面:
class IMyContentType(model.Schema):
organization = schema.Choice(title='',
source=Organizations(),
)
我的对象来源:
class OrganizationsSource(object):
implements(IQuerySource)
def __init__(self,context):
self.context = context
def queryOrganizations(self,value):
catalog = api.portal.get_tool(name='portal_catalog')
brains = catalog.evalAdvancedQuery(
AdvancedQuery.MatchRegexp('portal_type','Organization') &
AdvancedQuery.MatchRegexp('Title',value+"*")
)
return [i.Title for i in brains]
def __contains__(self,value):
q = self.queryOrganizations(value)
if len(q) > 0:
return True
else:
return False
def getTerm(self, value):
q = self.queryOrganizations(value)
#Where I check to see if it should be working
#the value passed in is the one that should be
print value, len(q)
return SimpleTerm(title=q[0],value=q[0])
def getTermByToken(self,token):
return self.getTerm(token)
def search(self,query_string):
q = self.queryOrganizations(query_string)
return [SimpleTerm(title=v,value=v,token=v) for v in q]
class Organizations(object):
implements(IContextSourceBinder)
def __init__(self):
self.context = self
def __call__(self, context):
return OrganizationsSource(context)
这种方法可行吗?我应该使用其他目录吗?
我还在 getTerm 函数中尝试了一个简单的 searchResults 而不是 evalAdvancedQuery:
def getTerm(self,value):
catalog = api.portal.get_tool(name='portal_catalog')
brains = catalog.searchResults({'portal_type':'Organization',
'Title':value,
})
return SimpleTerm(title=brains[0]['Title'],
value=brains[0]['Title'],
)
我遇到了同样的问题。
我正在使用 Plone 5.1。
首先,我建议您使用 ZCatalog 而不是 AdvancedQuery。
对于您正在做的事情,没有理由使用 AdvancedQuery。
只需通过 plone.api https://docs.plone.org/develop/plone.api/docs/content.html#find-content-objects 使用普通目录
还要确保用户具有查看您正在搜索的对象所需的权限。
示例:
from plone import api
def query_organizations(self, search_term):
search_term = search_term and search_term + '*' or ''
documents = api.content.find(
portal_type='Organization',
Title=search_term,
)
我有一个选择字段的源对象,它是一个自动完成小部件,它依赖于使用门户目录根据用户传入的值查找内容。不幸的是,在查看编辑表单时,portal_catalog 有时 returns 0 结果应该返回 1 结果。
应该返回 1 个结果的函数是 'getTerm'。我做了一个打印语句,看看它得到了多少结果,并确保传入的值是该术语的值。我的 print 语句显示传入的值始终是应有的值,但并不总能找到结果。我不确定为什么这是 'failing',当它在添加表单中工作时。
我的界面:
class IMyContentType(model.Schema):
organization = schema.Choice(title='',
source=Organizations(),
)
我的对象来源:
class OrganizationsSource(object):
implements(IQuerySource)
def __init__(self,context):
self.context = context
def queryOrganizations(self,value):
catalog = api.portal.get_tool(name='portal_catalog')
brains = catalog.evalAdvancedQuery(
AdvancedQuery.MatchRegexp('portal_type','Organization') &
AdvancedQuery.MatchRegexp('Title',value+"*")
)
return [i.Title for i in brains]
def __contains__(self,value):
q = self.queryOrganizations(value)
if len(q) > 0:
return True
else:
return False
def getTerm(self, value):
q = self.queryOrganizations(value)
#Where I check to see if it should be working
#the value passed in is the one that should be
print value, len(q)
return SimpleTerm(title=q[0],value=q[0])
def getTermByToken(self,token):
return self.getTerm(token)
def search(self,query_string):
q = self.queryOrganizations(query_string)
return [SimpleTerm(title=v,value=v,token=v) for v in q]
class Organizations(object):
implements(IContextSourceBinder)
def __init__(self):
self.context = self
def __call__(self, context):
return OrganizationsSource(context)
这种方法可行吗?我应该使用其他目录吗?
我还在 getTerm 函数中尝试了一个简单的 searchResults 而不是 evalAdvancedQuery:
def getTerm(self,value):
catalog = api.portal.get_tool(name='portal_catalog')
brains = catalog.searchResults({'portal_type':'Organization',
'Title':value,
})
return SimpleTerm(title=brains[0]['Title'],
value=brains[0]['Title'],
)
我遇到了同样的问题。
我正在使用 Plone 5.1。
首先,我建议您使用 ZCatalog 而不是 AdvancedQuery。 对于您正在做的事情,没有理由使用 AdvancedQuery。 只需通过 plone.api https://docs.plone.org/develop/plone.api/docs/content.html#find-content-objects 使用普通目录 还要确保用户具有查看您正在搜索的对象所需的权限。
示例:
from plone import api
def query_organizations(self, search_term):
search_term = search_term and search_term + '*' or ''
documents = api.content.find(
portal_type='Organization',
Title=search_term,
)