用于带有基于django表单的filternforms的django应用程序的纯queryset过滤器
datafilters的Python项目详细描述
摘要
为django驱动的网站实现可重用的queryset过滤的库。
此库提供了一种在 Django形成了一种方式。这种形式可以用作普通的django形式 还提供了一个方法filter,用于对任意查询集执行筛选。
这种方法与django admin中的方法有些不同,但是看起来 对作者来说直观而直接。
主要功能:
- 基于表单的声明和用法;
- 简单的API;
- 运行时感知过滤;
- 一些用于简单情况的内置规范。
用法
有关具体用法示例,请参见sample_proj/polls/views.py。
要执行筛选,必须定义 datafilters.filterform.FilterForm(过滤表单的基类)。 典型的声明由声明筛选器的类属性组成 规范,datafilters.filterspec.FilterSpec的子类。 这个串联非常像Form和Field对。 FilterSpec子类定义了一个对应的表单域 用于呈现和验证django表单,它还定义了一个方法 根据用户输入(to_lookup)获取查找条件。有 一堆内置规范,通常不需要实现 你自己的过滤器规格为简单的过滤。
例如,我们将使用django教程中的模型: Choice和Question。
典型的过滤器形式如下:
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')
直接使用过滤形式
定义的表单可以直接使用:
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_powereddecorator
在广泛使用筛选时,有一个decorator可以消除瓶颈:
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})
视图MIXIN < EH3>
如果您使用的是基于django类的视图,则可以采用另一个选项:a 查看Mixin ^ {TT13}$。示例:
from django.views.generic import ListView class ChoiceListView(FilterFormMixin, ListView): model = Choice filter_form_cls = ChoicesFilterForm choice_list = ChoiceListView.as_view()
模板中的使用
在我们的模板中,我们可以使用新的上下文变量filterform作为普通的 django表单:
<form class="filter" method="get" action=""> {{ filterform.as_p }} <input type="submit" value="Apply filter" /> </form>
要求
- django>;=1.3;
- django-forms-extras用于 一些内置规范(可选)。
版权所有
2010-2013年,尼古拉·扎哈罗夫。