plone - что может вызвать сбой каталога портала в исходном объекте для поля выбора автозаполнения в форме редактирования? - PullRequest
3 голосов
/ 25 марта 2019

У меня есть исходный объект для поля выбора, который является виджетом автозаполнения, и он использует каталог портала для поиска контента на основе значения, переданного пользователем.К сожалению, при просмотре формы редактирования, 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.

1 Ответ

1 голос
/ 26 марта 2019

Прежде всего, я бы порекомендовал вам использовать 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,
    )
...