显示所有过滤器的Django-Filter表单?

时间:2016-11-02 18:43:10

标签: django-filter django-filters

我刚刚开始使用Django Filter。当我测试时,filter.form显示所有字段的过滤器,我不能让它只显示所需的过滤器。

这是过滤器:

class EmployeeFilter(django_filters.FilterSet):
    hire_date = django_filters.DateFilter(name='hireDate', lookup_expr='hireDate__year')
    hire_date__gte = django_filters.DateFilter(name='hireDate', lookup_expr='hireDate__gte')
    hire_date__lte = django_filters.DateFilter(name='hireDate', lookup_expr='hireDate__lte')   

    class Meta:
        model = models.Employee
        fields=['hireDate']

以下是观点:

def test_filters(request, template_name='filter-test.html'):
    from . import filters

    f = filters.EmployeeFilter(request.GET, queryset=models.Employee.objects.all()) 

    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

有没有人碰到这个?你怎么解决的?

3 个答案:

答案 0 :(得分:0)

过滤器集的形式同时扮演Django Form的两个角色:

  • 使您可以在模板中显示表单
  • 验证传入的值。

其中第二个(可以说)更重要 - 当然对于Django过滤器:如果从表单中删除字段,则将不会进行过滤。

您最好的选择可能只是在过滤器集上定义较少的字段。 (如果在某些情况下需要所有字段,只需定义两个过滤器集,每个需要一个。)

(另一种选择是定义一个单独的Django表单,只包含你需要的字段并在你的模板中使用它,留下过滤器集的表格来进行实际的验证。)

我希望有所帮助。

答案 1 :(得分:0)

models.py

class Employee(models.Model):
    hire_date = models.DateField()
    name = models.CharField(max_length=128)

filters.py

class EmployeeFilter(django_filters.FilterSet):
    hire_date = django_filters.DateFilter(field_name='hire_date', lookup_expr='gt')
    hire_date__gte = django_filters.DateFilter(field_name='hire_date', lookup_expr='gt')
    hire_date__lte = django_filters.DateFilter(field_name='hire_date', lookup_expr='gt')
    name__icontains = django_filters.CharFilter(field_name='name', lookup_expr='icontains')

    class Meta:
        model = Employee
        fields = {}

views.py

def employee_view(request):
    f = EmployeeFilter(request.GET, queryset=Employee.objects.all())
    return render(request, 'product/employee.html', {'filter': f})

templates / my-app / employee.html

<h1>Employee</h1>
<form method="get">
    {{ filter.form.as_p }}
    <input type="submit"/>
</form>
<ul>
    {% for employee in filter.qs %}
        {{ employee.hire_date }}<br/>
    {% endfor %}
</ul>

field_name指定模型中字段的名称,即Employee,而lookup_expr是一个字符串,该字符串指定要在表的列上使用的过滤器,例如gtgteltlteexactiexactcontains,{{ 1}}

答案 2 :(得分:0)

如果要针对某个字段进行过滤,但又不想在表单中使用它,则可以执行以下操作:

import django_filters
from django import forms


class MyFilter(django_filters.FilterSet):
    field = django_filters.CharFilter(
        widget=forms.HiddenInput()
    )

    class Meta:
        model = MyModel
        fields = ['other_field', 'field']

唯一的缺点是,当您提交表单时,它将在URL中显示为空参数。但这不会影响您的结果,因为它的值为空。