我想知道如何在基于django类的列表视图上执行搜索。 我正在处理有很多列表的项目,每个列表都包含一定的搜索。例如:一个人名单支持按姓名,性别,年龄或任何事情进行搜索....
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 %}
另外,如果我进行搜索,搜索查询集将取代初始查询集,以便分页符基于搜索结果工作。
答案 0 :(得分:1)
&#34;自&#34; get_queryset函数中的参数包含kwargs哈希。所以你可以通过GET传递搜索参数。并在get_queryset中进行过滤。例如:
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