Package: datafilters
AbstractLibrary to implement reusable queryset filtering for django-powered websites.This library provides a way to declaratively define filter specifications in a
django-forms manner. Such forms can be used as ordinary django forms and they
also provides a methodfilterto perform filtering of arbitrary querysets.This approach is somewhat differs from one in django-admin, but it looks more
intuitive and straightforward for the author.Main features:forms-based declaration and usage;simple API;easy to implement and reuse abstract filter specs of any complexity (from
standard lookups toQuerySet.extracalls);runtime-aware filtering;a number of builtin specs for simple cases.UsageFor concrete usage example, seesample_proj/polls/views.py.To perform filtering one must define a subclass ofdatafilters.filterform.FilterForm(base class for filter forms).
The typical declaration consists of class attributes declaring filter
specifications, subclasses ofdatafilters.filterspec.FilterSpec.
This tandem is very much like theFormandFieldpair.FilterSpecsubclass defines a corresponding form field that will be
used to render and validate a django form and it also defines a method
to get lookup conditions based on user input (to_lookup). There is
a bunch of builtin specs so typicaly it is not necessary to implement
your own filter specs for simple filtering.For example purposes we will use models from django tutorial:ChoiceandQuestion.The typical filter form looks like that:from datafilters.filterform import FilterForm
from datafilters.specs import ContainsFilterSpec, \
    SelectBoolFilterSpec

class ChoicesFilterForm(FilterForm):
    choice_text = ContainsFilterSpec('choice',
                                     label='Choice contains text')
    question_text = ContainsFilterSpec('poll__question',
                                       label='Question contains text')
    has_votes = GreaterThanZeroFilterSpec('votes')Direct usage of filter formDefined form can be used directly:from django.shortcuts import render_to_response
from polls.models import Choice

def choice_list(request):
    choices = Choice.objects.all()
    filterform = ChoicesFilterForm(request.GET)
    if filterform.is_valid():
        choices = filterform.filter(choices)

    return render_to_response('polls/choice_list.html',
        {
            'choices': choices,
            'filterform': filterform,
        })filter_powereddecoratorThere is a decorator to remove bottlenecks when using filtering extensively:from django.template.response import TemplateResponse
from datafilters.decorators import filter_powered

@filter_powered(ChoicesFilterForm, queryset_name='choices')
def choice_list(request):
    choices = Choice.objects.all()
    return TemplateResponse('polls/choice_list.html',
        {'choices': choices})View mixinIf you are using django class-based views there is another option to take: a
view mixinFilterFormMixin. Example:from django.views.generic import ListView

class ChoiceListView(FilterFormMixin, ListView):
    model = Choice
    filter_form_cls = ChoicesFilterForm

choice_list = ChoiceListView.as_view()Usage in templatesIn our template we can use new context variablefilterformas an ordinary
django form:<form class="filter" method="get" action="">
    {{ filterform.as_p }}
    <input type="submit" value="Apply filter" />
</form>RequirementsDjango >= 1.3;django-forms-extrasfor
some of builtin specifications (optional).Copyright2010-2013, Nikolay Zakharov.