基于django类的视图如何在列表上执行搜索

时间:2014-06-16 09:14:23

标签: django

我想知道如何在基于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 %}

另外,如果我进行搜索,搜索查询集将取代初始查询集,以便分页符基于搜索结果工作。

1 个答案:

答案 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