Python plone-在编辑表单中,是什么导致门户目录在自动完成选择字段的源对象中失败?

Python plone-在编辑表单中,是什么导致门户目录在自动完成选择字段的源对象中失败?,python,plone,plone-5.x,Python,Plone,Plone 5.x,我有一个选择字段的源对象,它是一个自动完成小部件,它依赖于使用门户目录根据用户传入的值查找内容。不幸的是,在查看编辑表单时,门户目录有时会返回0个结果,而它应该返回1个结果 应该返回1个结果的函数是“getTerm”。我做了一个print语句来查看它得到了多少结果,并确保传入的值是术语的值。我的print语句显示传入的值始终是应该的值,但它并不总是找到结果。当它在Add表单中工作时,我不知道为什么会“失败” 我的界面: class IMyContentType(model.Schema):

我有一个选择字段的源对象,它是一个自动完成小部件,它依赖于使用门户目录根据用户传入的值查找内容。不幸的是,在查看编辑表单时,门户目录有时会返回0个结果,而它应该返回1个结果

应该返回1个结果的函数是“getTerm”。我做了一个print语句来查看它得到了多少结果,并确保传入的值是术语的值。我的print语句显示传入的值始终是应该的值,但它并不总是找到结果。当它在Add表单中工作时,我不知道为什么会“失败”

我的界面:

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使用普通目录即可 还要确保用户具有查看您正在搜索的对象所需的权限

例如:

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,
    )

请在我们的论坛上提问,谢谢您的回复。我不太确定如何查询部分搜索。我用您的方法替换了高级查询,不幸的是,我得到了相同的结果。由于用户有时会得到结果,我不确定这是否是权限问题,除非用户(甚至管理员)被随机拒绝访问?实际上,当用户第一次单击文本字段输入值时,查询似乎失败了,其中触发了getTerm。其他时候调用getTerm时,它似乎可以工作。正如您所建议的,这一定是权限问题。我尝试使用unrestrictedSearchResults:catalog.unrestrictedSearchResults({'portal_type':'Organization','Title':search_term}),它返回给我一个术语。嗯,同一用户在同一上下文中应该具有相同的权限。也许你可以让pdb介入其中,看看你是否真的是同一个用户并且一直拥有相同的权限。plone.api是您获取这些信息的首选工具。如果您只有重要的本地角色/权限,则可能处于不同的上下文中。“添加表单”和“编辑表单”之间也可能存在差异;)。