2017-08-22 118 views
1

我正在使用django-filter来搜索模型。下面是代码:Django过滤器:动态创建搜索或隐藏查询集的查询集直到搜索

filters.py:

class PersonFilter(django_filters.FilterSet): 
    lastName = django_filters.CharFilter(lookup_expr='icontains') 
    firstName = django_filters.CharFilter(lookup_expr='icontains') 
    class Meta: 
     model = Person 
     fields = ['lastName', 'firstName'] 

views.py:

def search(request): 
    people = Person.objects.all() 
    people = PersonFilter(request.GET, queryset=people) 
    context = {'filter': people} 
    return render(request, 'myapp/template.html', context) 

template.html:

<form method="get"> 
    {{ filter.form.as_p }} 
    <button type="submit">Search</button> 
    </form> 
    <table> 
    {% for field in filter.qs %} 
    <tr> 
    <td> 
     {{ field.idno }} 
    </td> 
    <td> 
     {{ field.lastName }} 
    </td> 
    <td> 
     {{ field.firstName }} 
    </td> 
    <td> 
     {{ field.status }} 
    </td> 
    </tr> 
    {% endfor %} 
</table> 
{% endblock %} 
</body> 
</html> 

眼下,这导致表用名字和姓氏的搜索框来镜像我的模型。搜索完美无缺。

如何防止最初显示数据表?从逻辑上讲,这可以通过表面(隐藏)完成,或者更好的是,实质上(动态创建queryset)。这可能吗?

回答

0

您可以利用FilterSet的is_bound属性,尽管您需要将视图代码更改为仅在提交表单时提供请求查询参数。

def search(request): 
    submitted = 'submitted' in request.GET 
    data = request.GET if submitted else None 
    people = PersonFilter(data, queryset=Person.objects.all()) 

    return render(request, 'myapp/template.html', {'filter': people}) 
<form method="get"> 
    {{ filter.form.as_p }} 
    <button type="submit" name="submitted">Search</button> 
        <!-- ^^^^ added 'name' parameter --> 
</form> 

{% if filter.is_bound %} 
<table> 
{% for person in filter.qs %} 
...