在Django admin中按自定义日期范围过滤

Dmi*_*kov 20 django date filter django-admin

可以通过自定义日期范围,即用两个Django管理站点选择项DateFieldsAdminDateWidget?我知道有date_hierarchylist_filter属性,但是当有很多数据库条目并且你只需要按精确date__gtedate__lte查询过滤项目时它们似乎不是很有用.

bsm*_*bsm 37

在django 1.4中,您可以使用list_filter.尝试:

from django.contrib.admin import DateFieldListFilter
class PersonAdmin(ModelAdmin):
    list_filter = (
        ('date_field_name', DateFieldListFilter),
    )
Run Code Online (Sandbox Code Playgroud)

这将提供一些内置范围,但如果您将日期范围放在url中,它将起作用,如:

?date__gte=2009-5-1&date__lt=2009-8-1
Run Code Online (Sandbox Code Playgroud)

如果需要日期选择器(如jquery),则需要扩展DateFieldListFilter.我发送了一个补丁给django-admin-filtrate,所以,请尽快查看.


Ala*_*air 23

注意:我在2009年写了这个答案,当时Django中没有所需的功能作为公共API.对于Django 1.4+,请参阅其他答案.

据我所知,此功能未提供,但您可以自行构建.

首先,您可以使用url 过滤项目date__gtedate__lte作为GET参数.

例如

/admin/myapp/bar/?date__gte=2009-5-1&date__lt=2009-8-1
Run Code Online (Sandbox Code Playgroud)

将显示2009年5月,6月或7月日期的所有酒吧对象.

然后,如果您覆盖admin/change_list.html模板文件,则可以为开始日期和结束日期添加小部件,这些小部件将导航到所需的URL.


提示丹尼尔对另一个SO问题的答案,这个问题告诉我使用queryset过滤器参数作为GET参数.


Fis*_*tor 12

您可以使用这个最新的:https://github.com/silentsokolov/django-admin-rangefilter.下面是截图

  • 该项目已移至新的所有者.截至2018年的最新信息 - https://github.com/silentsokolov/django-admin-rangefilter (2认同)

nem*_*ixx 8

现在可以使用标准Django API轻松实现Custom Admin过滤器.在文档中list_filter,您现在可以添加:

从django.contrib.admin.SimpleListFilter继承的类,您需要为其提供title和parameter_name属性并覆盖查找和查询集方法

然后他们继续演示(滚动到第二个子弹).我自己用它来添加过滤器,它们与对象的底层关系不是通过模型属性,而是通过它们的方法结果,这是传统过滤器不提供的.


Run*_*ard 5

DateRangeFilter()https://github.com/runekaagaard/django-admin-filtrate找到的课程就是这样:)


dan*_*son 5

我最终实现了这样的东西,admin.py

 class FooAdmin(MyModelAdmin):

     def changelist_view(self, request, extra_context=None):

         extra_context = extra_context or {}
         try:
             extra_context['trade_date_gte'] = request.GET['date__gte']
         except:
             pass

         try:
             extra_context['trade_date_lte'] = request.GET['date__lte']
         except:
             pass

     return super(FileNoteAdmin, self).changelist_view(request, extra_context)  
Run Code Online (Sandbox Code Playgroud)

change_list.html

{% extends "admin/admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load url from future %}
{% load admin_urls %}


{% block filters %}

{% if cl.has_filters %}
  <div id="changelist-filter">
    <h2>{% trans 'Filter' %} </h2>

<h3>By trade date</h3>

<link href="/media/css/ui-lightness/jquery-ui-1.8.19.custom.css" rel="stylesheet" type="text/css"/>
<script src="/media/js/jquery/jquery-min.js"></script>
<script src="/media/js/jquery/jquery-ui-1.8.19.custom.min.js"></script>

<script>

    $(function() {
        $( "#trade_date_gte" ).datepicker({ dateFormat: 'yy-mm-dd'{% if trade_date_gte %}, defaultDate: '{{ trade_date_gte }}'{% endif %} }); 
        $( "#trade_date_lte" ).datepicker({ dateFormat: 'yy-mm-dd'{% if trade_date_lte %}, defaultDate: '{{ trade_date_lte }}'{% endif %} });
    });

function applyDateFilters() {

    qs = location.search;

    if (qs.charAt(0) == '?') qs = qs.substring(1);

    var qsComponents = qs.split(/[&;]/g);

    new_qs = [];
    for (var index = 0; index < qsComponents.length; index ++){

        var keyValuePair = qsComponents[index].split('=');
        var key          = keyValuePair[0];
        var value        = keyValuePair[1];

        if(key == 'trade_date__gte' || key == 'trade_date__lte' || key == '') {
            continue;
        } else {
            new_qs[index] = key + '=' + value;
        }
    }

    if($( "#trade_date_gte" ).val() != '') {
        new_qs[new_qs.length] = 'trade_date__gte=' + $( "#trade_date_gte" ).val();
    }
    if($( "#trade_date_lte" ).val() != '') {
        new_qs[new_qs.length] = 'trade_date__lte=' + $( "#trade_date_lte" ).val();
    }

    window.location = '?' + new_qs.join("&");
}
</script>

<p>
From: <br /><input type="text" id="trade_date_gte" value="{{ trade_date_gte|default:'' }}" size="10"><br />
To: <br /><input type="text" id="trade_date_lte" value="{{ trade_date_lte|default:'' }}" size="10">
</p>

<ul>
    <li><a href="#" onclick="javascript:applyDateFilters();">Apply date filters</a></li>
</ul>

    {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %}
  </div>
{% endif %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

被过滤的日期列是trade_date