用于带有基于django表单的filternforms的django应用程序的纯queryset过滤器

datafilters的Python项目详细描述


https://secure.travis-ci.org/freevoid/django-datafilters.png?branch=master

摘要

为django驱动的网站实现可重用的queryset过滤的库。

此库提供了一种在 Django形成了一种方式。这种形式可以用作普通的django形式 还提供了一个方法filter,用于对任意查询集执行筛选。

这种方法与django admin中的方法有些不同,但是看起来 对作者来说直观而直接。

主要功能:

  • 基于表单的声明和用法;
  • 简单的API;
  • 容易实现和重用任何复杂的抽象过滤器规格(从 对QuerySet.extra调用的标准查找);
  • 运行时感知过滤;
  • 一些用于简单情况的内置规范。

用法

有关具体用法示例,请参见sample_proj/polls/views.py

要执行筛选,必须定义 datafilters.filterform.FilterForm(过滤表单的基类)。 典型的声明由声明筛选器的类属性组成 规范,datafilters.filterspec.FilterSpec的子类。 这个串联非常像FormField对。 FilterSpec子类定义了一个对应的表单域 用于呈现和验证django表单,它还定义了一个方法 根据用户输入(to_lookup)获取查找条件。有 一堆内置规范,通常不需要实现 你自己的过滤器规格为简单的过滤。

例如,我们将使用django教程中的模型: ChoiceQuestion

典型的过滤器形式如下:

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>

要求

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JavaBridge errno=10054被Remotehost关闭   javafx如何在每次调用方法中的变量时更新它?(爪哇)   java mod_群集在发现后未平衡负载   Java软件编辑器/语法高亮   java为什么不能强制转换数组的结果。asList()到ArrayList?   java HIBERNATE:无法使用HIBERNATE从MySQL中提取数据   java在Google地图片段上添加布局   java在AbstractTableModel中执行setValueAt之前,我如何做一些事情?   java在整个Tomcat运行时保存变量   java如何在Thymeleaf模板中获取环境变量的值?   java Selenium Chrome驱动程序针对属性的标签   java正则表达式捕获未知数量的重复组