У меня есть исходный объект для поля выбора, который является виджетом автозаполнения, и он использует каталог портала для поиска контента на основе значения, переданного пользователем.К сожалению, при просмотре формы редактирования, portal_catalog иногда возвращает 0 результатов, где он должен возвращать 1 результат.
Функция, которая должна возвращать 1 результат, - это getTerm.Я сделал оператор print, чтобы увидеть, сколько результатов он получил, и убедиться, что передаваемое значение соответствует значению термина.Мой оператор печати показывает, что переданное значение всегда должно быть таким, но оно не всегда находит результат.Я не уверен, почему это «сбой», когда он работает в форме добавления.
Мой интерфейс:
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.