Reputation: 35
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
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