首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Plone上的日期范围搜索内容

如何使用Plone上的日期范围搜索内容
EN

Stack Overflow用户
提问于 2014-07-14 19:37:04
回答 2查看 691关注 0票数 0

Plone为您提供了使用日期范围过滤搜索结果的可能性。通常的日期范围是通过使用最小日期来设置的,因此范围是在今天到过去的某个日期之间。

我需要添加设置日期范围的选项,包括开始日期和结束日期。

我正在考虑添加一个额外的选项,当被选中时,它将显示几个日期选择器,但我不知道如何设置created.query:record:list:date变量来使用这2个值。

我尝试在query变量上传递一个列表,但之后我得到了:

代码语言:javascript
复制
Error Value: Invalid DateTime "[DateTime('2000/07/14 00:00:00 GMT-3'), DateTime('2014/07/14 00:00:00 GMT-3')]"

以前有没有人发现过这样的要求?你是怎么解决的?这应该移植到核心吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-17 00:38:28

我花了一些时间调查这个问题,我有了一个可行的解决方案。

首先,我们需要了解Zope和ZPT是如何工作的;当您用类似于created.query:record:list:date的东西命名表单元素时,您要告诉Zope执行一些参数转换:

  • record ,将变量转换为记录属性。
  • 列表,将变量转换为
  • date,将字符串转换为DateTime对象

有关这方面的更多信息,您可以查看高级Zope脚本

因此,参数将自动转换为Python中的字典记录:

代码语言:javascript
复制
'created': {'query': [DateTime('2014/07/09 00:00:00 GMT-3')], 'range': 'min'}

我的错误是假设必须在一个请求变量上传递所有list元素。

我在表单末尾添加的代码现在如下所示:

代码语言:javascript
复制
<input type="radio"
       id="query-date-range"
       name="created.query:record:list:date:ignore_empty"
       tal:attributes="value python:'';
                       checked python:checked=='' and 'checked' or '';"
       />
<label for="query-date-range" i18n:translate="time_range">Time range</label>
<input type="text"
       id="range-start"
       name="created.query:record:list:date:ignore_empty">
<input type="text"
       id="range-end"
       name="created.query:record:list:date:ignore_empty">
<script>
var today = new Date();
var yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
var start = yesterday.toLocaleDateString().slice(0, 10);
var end = today.toLocaleDateString().slice(0, 10);
$(document).ready(function() {
    $("#range-start").datepicker();
    $("#range-end").datepicker();
    $('#range-start').hide();
    $('#range-end').hide();
});

$('input:radio').change(function() {
    var option = $('input:radio:checked', '#searchform').val();
    if (option === '') {
        $('#range-start').val(start);
        $('#range-start').show();
        $('#range-end').val(end);
        $('#range-end').show();
        $('#range').val('min:max');
    }
    else {
        $('#range-start').val('');
        $('#range-start').hide();
        $('#range-end').val('');
        $('#range-end').hide();
        $('#range').val('min');
    };
});
</script>

特别注意以下几点:

  • 开始日期和结束日期是与jQueryUI数据报头小部件相关联的输入元素。
  • 两个输入元素与另一个共享相同的名称(created.query:record:list:date:ignore_empty),这里是Zope魔术发生的地方:所有具有相同名称的输入元素的值都在一个惟一的列表记录上转换,如下所示:
代码语言:javascript
复制
'created': {'query': [DateTime('2014/07/15 00:00:00 GMT-3'), DateTime('2014/07/16 00:00:00 GMT-3')], 'range': 'min:max'}
  • 我们设置了一个附加参数转换器(ignore_empty),它只是避免将没有值集的元素添加到列表中(我也将此转换器添加到其他输入元素中)。
  • 当我们单击query-date-range元素时,我们必须初始化日期选择器;当我们单击任何其他元素时,我们需要清除这些值,以避免将它们添加到列表中。
  • 我们还根据@sdupton前面提到的查询类型更改了range元素的值。

代码的JavaScript部分可以肯定地得到增强;我的技能非常有限。

票数 1
EN

Stack Overflow用户

发布于 2014-07-14 20:46:02

您可能希望使用range参数传递索引名称的查询dict。假设您的索引是“修改”的,并且您希望得到一个最小和最大的范围,如下所示:

代码语言:javascript
复制
>>> from DateTime import DateTime
>>> from Products.CMFCore.utils import getToolByName
>>> catalog = getToolByName(site)
>>> startDT = DateTime(2010,12,1)
>>> endDT = DateTime(2013,12,1)
>>> query = {
...     'modified': {
...         query: (startDT, endDT),
...         range: 'min:max',
...         }
...     }
... 
>>> result = catalog.unrestrictedSearchResults(query)  # or .search()

这里记录了一些类似的内容:索引/query.html#按日期查询

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24744466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档