我刚刚开始使用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))
有没有人碰到这个?你怎么解决的?
答案 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
是一个字符串,该字符串指定要在表的列上使用的过滤器,例如gt
,gte
,lt
,lte
,exact
,iexact
,contains
,{{ 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中显示为空参数。但这不会影响您的结果,因为它的值为空。