Django管理网站可以按自定义日期范围选择条目,即使用两个DateFields
和AdminDateWidget
吗?我知道有date_hierarchy
和list_filter
属性,但是当有大量数据库条目时,它们似乎不太有用,您只需要按照date__gte
和{过滤项目{1}}查询。
答案 0 :(得分:36)
在django 1.4中,您可以使用list_filter。尝试:
from django.contrib.admin import DateFieldListFilter
class PersonAdmin(ModelAdmin):
list_filter = (
('date_field_name', DateFieldListFilter),
)
这将提供一些内置范围,但如果您将日期范围放在网址中,它将起作用,如:
?date__gte=2009-5-1&date__lt=2009-8-1
如果您需要日期选择器(如jquery),则需要扩展DateFieldListFilter。我发送了一个补丁给django-admin-filtrate,所以,请尽快查看。
答案 1 :(得分:22)
注意:我在2009年写了这个答案,当时Django中没有所需的功能作为公共API。对于Django 1.4+,请参阅其他答案。
据我所知,此功能未提供,但您可以自行构建。
首先,您可以使用date__gte
和date__lte
过滤项目作为网址中的GET参数。
例如
/admin/myapp/bar/?date__gte=2009-5-1&date__lt=2009-8-1
将显示2009年5月,6月或7月日期的所有酒吧对象。
然后,如果您覆盖admin/change_list.html模板文件,则可以为开始日期和结束日期添加小部件,这些小部件将导航到所需的网址。
向另一个SO问题提示Daniel's answer,这教会我使用queryset过滤器参数作为GET参数。
答案 2 :(得分:11)
答案 3 :(得分:8)
现在可以使用标准Django API轻松实现自定义管理过滤器。在list_filter
中的文档日,您现在可以添加:
继承自django.contrib.admin.SimpleListFilter的类,您需要提供title和parameter_name属性并覆盖查找和查询集方法
他们继续demo(滚动到第二个子弹)。我自己用它来添加过滤器,它们与对象的底层关系不是通过模型属性,而是通过它们的方法结果,这是传统过滤器不提供的。
答案 4 :(得分:5)
在https://github.com/runekaagaard/django-admin-filtrate找到的DateRangeFilter()
课程确实如此:)
答案 5 :(得分:4)
我最终实现了这样的事情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)
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 %}
正在过滤的日期列为trade_date
。