django-filterview
is a class based view on top of generic ListView with
filtering of the queryset by mapping URL params into filter() arguments.
Just download source code and extract filterview
directory to your PYTHON_PATH
.
No changes in settings.py
required.
In your urls.py insert this line:
from filterview import FilterView
Then just define url pattern with named params and FilterView.as_view()
as url processing view.
The only required FilterView.as_view()
arguments are model
and mapping
. First one plays
the same role as model
argument of ListView. mapping
is dictionary for mapping
url params values to filter()
arguments. For example:
{
'name': lambda key, value: [('first_name', value)],
'age': lambda key, value: [(
'birthdate__range', (
datetime.today() - timedelta( days=366*int(value.split('-')[1]) ),
datetime.today() - timedelta( days=365*int(value.split('-')[0]) ),
)
)],
}
django-filterview
accepts all ListView arguments and additionally mapping
argument.
Required arguments are:
model
- filtering queryset model objectmapping
- dictionary with keys named like url params and function object returning list of tuples.
mapping
dictionary function object takes url param name and its value as arguments. Each tuple
of returned list has two items - first one is filter()
argument name and the last
is its value. So each url param can be mapped into two or more filter()
argument.
Note: if some url param is not presented in mapping
dictionary it's taken from url and used
in filter()
with no changes.
Using above example mapping dictionary and url pattern
r'^(/(?P<name>[\w\d\s%]+))?(/(?P<gender>(M|F)))?(/(?P<age>[\d]+\-[\d]+))?/?$'
Result filter()
arguments for url /Jhon/M/30-37
are:
filter(first_name=<value for name url param>, gender=<value for gender url param>, birtdate__range=(
datetime.today() - timedelta( days=366*int(value.split('-')[1]) ),
datetime.today() - timedelta( days=365*int(value.split('-')[0]) ),
))