2017-08-22 37 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 %} 
...