leffe
leffe

Reputation: 35

how does django class based view perform a search on list

i am wondering to ask how to perform a search on django class based list view. i am working on project which has a lot of list, and each list contains certain search. eg: a person list supports search by name, sex, age or what ever....

urls.py

urlpatterns = patterns('',
    url(r'^person_list/', PersonListView.as_view()),
)

views.py

class PersonListView(ListView):

    template_name = "person_list_page.html"
    paginate_by = 20

    def get_queryset(self):
        queryset = Person.objects.all()

html

<form action="" method="get">
    <input type="text" name='name'>
    <select name="sex">
        <option value="0">female</option>
        <option value="1">male</option>
    </select>
    <input type="submit" name='search' value="Search">
</form>

{% for personin object_list.all %}
    <tr>
        <td>{{ person.name }}</td>
    </tr>
{% endfor %}

{% if is_paginated %}
    <div class="pagination">
        <span class="page-links">
            {% if page_obj.has_previous %}
                <a href="?page={{ page_obj.previous_page_number }}"><<</a>
            {% endif %}
            <span class="page-current">
                Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
            </span>
            {% if page_obj.has_next %}
                <a href="?page={{ page_obj.next_page_number }}">>></a>
            {% endif %}
        </span>
    </div>
{% endif %}

plus, if i do a search, search queryset will take place of the initial queryset, so that the paginate will work base on the search result.

Upvotes: 1

Views: 142

Answers (1)

Eugene Soldatov
Eugene Soldatov

Reputation: 10135

"self" parameter in get_queryset function contains kwargs hash. So you can pass search parameters through GET. And do filtering in get_queryset. For example:

from django.db.models import Q

class PersonListView(ListView):

    def get_queryset(self):
        where_filter = Q()
        name = self.kwargs.get('name')
        if name:
            where_filter &= Q(name__icontains=name)
        min_age = self.kwargs.get('min_age')
        if min_age:
            where_filter &= Q(age__gte=min_age)
        objects = self.model.objects.filter(where_filter)
        return objects

Upvotes: 1

Related Questions