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

标签 python plone plone-5.x

我有一个选择字段的源对象,它是一个自动完成小部件,它依赖于使用门户目录根据用户传入的值查找内容。不幸的是,在查看编辑表单时,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。

最佳答案

首先,我建议您使用 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,
    )

关于python - plone - 在编辑表单中时,什么会导致门户目录在自动完成选择字段的源对象中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339340/

相关文章:

python - 在 Python 中写入文件时如何写入新行?

Python If-elif 语句

Plone 5 将站点转换为 Intranet

python - 比较数据帧的值为 "PO","GO"等的两个字符串列,并创建值为 "High","Low"和 "No Change"的第三列

templates - jbot 没有覆盖我的模板

plone - 如何在不重新启动 zeo 的情况下杀死 zeopack?

adapter - Plone 不使用我的自定义 Collective.opengraph 适配器

migration - Plone 5资源注册表在生产中合并了已编译的捆绑软件

python - Django 模型表单 - 动态创建字段的顺序