【问题标题】:How to use custom DateRangePicker widget with Django Filter's DateFromToRangeFilter如何将自定义 DateRangePicker 小部件与 Django 过滤器的 DateFromToRangeFilter 一起使用
【发布时间】:2020-02-15 09:43:21
【问题描述】:

所以我有这个过滤器使用Django Filter:

class AssignmentFilter(FilterSet):
    assignment_date = filters.DateFromToRangeFilter()

这个内置的 Django 过滤器类会生成一个包含这两个输入的表单:

<input type="text" name="assignment_date_after" id="id_assignment_date_0">
<input type="text" name="assignment_date_before" id="id_assignment_date_1">

因此,您可以在此处选择两个日期,并据此获得过滤后的 QuerySet。一切正常。

但是我想使用这个有用的 DateRangePicker: https://www.daterangepicker.com/

这样激活:

<input type="text" name="dates" class="form-control">

<script>
$('input[name="dates"]').daterangepicker();
</script>

但是,正如您所见,这只是一个用于设置日期范围的字段。但是Django Filter 使用开始输入字段和结束输入字段。

如何修改它以便我可以使用属于input[name="dates"] 的漂亮小部件。

也许一个解决方案是在 GET 请求之后使用 JavaScript 处理它。然后该函数将获取开始日期并将其注入id_assignment_date_0 字段。并将结束日期注入id_assignment_date_1 字段。 id_assignment_date_0id_assignment_date_1 字段都将在视觉上隐藏然后在表单中。不过,这似乎很hacky。

有人对此有聪明的解决方案吗?

【问题讨论】:

    标签: javascript jquery django django-filter


    【解决方案1】:

    根据this example,你可以这样完成你想要的:

    <input type="text" id="datePicker" name="dates" class="form-control">
    <input type="hidden" name="assignment_date_after" id="id_assignment_date_0">
    <input type="hidden" name="assignment_date_before" id="id_assignment_date_1">
    
    <script>
    $(function() {
      $('input[name="dates"]').daterangepicker({
        opens: 'left'
      }, function(start, end, label) {
        $('#id_assignment_date_0').val(start)
        $('#id_assignment_date_1').val(end)
      });
      $('#datePicker').removeAttr('name');
    });
    </script>
    

    虽然,格式可能与您需要的不同。您还可以使用以下内容更改格式:

    $('#id_assignment_date_0').val(start.format('YYYY-MM-DD'))
    

    【讨论】:

    • 这不起作用。参数变得非常奇怪。根据您的回答,我得到这个 url 结尾:domain.com/somepage?dates=02%2F18%2F2020+-+02%2F20%2F2020&amp;assignment_date_after=18%2F02%2F2020&amp;assignment_date_before=18%2F02%2F2020
    • 使过滤器工作所需的网址:domain.com/somepage?assignment_date_after=18%2F02%2F2020&amp;assignment_date_before=20%2F02%2F2020
    • 我已编辑答案以禁用在您的GET 请求中发送dates 参数。
    • 您可以忽略后端中的dates 参数,只使用您想要的参数。
    • 现在可以使用了!我更新了你的答案。 99% 正确,只需添加这一行:$('#datePicker').removeAttr('name'); 在这篇文章中找到它:stackoverflow.com/a/20877611/10938976
    猜你喜欢
    • 2017-08-17
    • 2011-05-31
    • 2023-03-13
    • 1970-01-01
    • 2013-09-08
    • 2019-12-13
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    相关资源
    最近更新 更多