from django import forms
from django_filters import Filter
import datetime
class DateRangeWidget(forms.MultiWidget):
def __init__(self, attrs=None):
attrs_from = {'class': 'date-from'}
attrs_to = {'class': 'date-to'}
if attrs:
attrs_from.update(attrs)
attrs_to.update(attrs)
widgets = (forms.TextInput(attrs=attrs_from), forms.TextInput(attrs=attrs_to))
super(DateRangeWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return [value.start, value.stop]
return [None, None]
def format_output(self, rendered_widgets):
return '<div class="date-range">' + ' - '.join(rendered_widgets) + '</div>'
class DateRangeField(forms.MultiValueField):
widget = DateRangeWidget
def __init__(self, *args, **kwargs):
fields = (
forms.DateField(),
forms.DateField(),
)
super(DateRangeField, self).__init__(fields, *args, **kwargs)
def compress(self, data_list):
if data_list:
return slice(*data_list)
return None
class DateRangeFilter(Filter):
field_class = DateRangeField
def filter(self, qs, value):
date_start = datetime.datetime.combine(value.start, datetime.time(0, 0, 0))
date_stop = datetime.datetime.combine(value.stop, datetime.time(23, 59, 59))
if value:
return qs.filter(**{lookup: (date_start, date_stop)})
return qs
then in filters.py:
class SomeFilter(django_filters.FilterSet):
date = filter_extra.DateRangeFilter(label='Date Range')
and then in JS something like this
// Date Range Filter - Start
$('.date-range').each(function(i, el) {
$(el).find('input').daterangepicker(
{
ranges: {
'Today': [moment(), moment()],
'Yesterday': [moment().subtract('days', 1), moment().subtract('days', 1)],
'Last 7 Days': [moment().subtract('days', 6), moment()],
'Last 30 Days': [moment().subtract('days', 29), moment()],
'This Month': [moment().startOf('month'), moment().endOf('month')],
'Last Month': [moment().subtract('month', 1).startOf('month'), moment().subtract('month', 1).endOf('month')]
},
startDate: moment().subtract('days', 29),
endDate: moment()
},
function(start, end) {
$(el).find('.date-from').val(start.format('MM/DD/YYYY'));
$(el).find('.date-to').val(end.format('MM/DD/YYYY'));
}
);
});
// Date Range Filter - End
may by help
Rasto
Dňa streda, 21. augusta 2013 18:08:01 UTC+2 Tim Zenderman napísal(-a):