如何使用带有 ListView class 视图的 django-filter 进行搜索?

How to use django-filter with a ListView class view for search?

我有一个过滤器:

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = '__all__'

和一个 ListView 来查看结果:

class SearchResultsListView(ListView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'book/search_results.html'

我想要一个搜索表单,您可以在其中根据 class 的所有字段进行过滤(例如,X 撰写的所有超过 3 星的书籍)。

如何将表单传递给模型,如何使用 get 请求根据需要使用 django-filter 进行过滤?

我正在使用 Django 3.0 和 django-filter 2.2.0

我认为 django-filter documentation under Generic view & configuration 部分中的所有内容都有详细的记录。

django_filters.views.FilterView class 类似于 Django 的 ListView ,您可以使用它来过滤结果。

from django_filters.views import FilterView


class SearchResultsListView(FilterView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'book/search_results.html'
    filterset_class = BookFilter # ADD YOUR filterset class

并在您的 book/search_results.html 模板中做一些更改 mentioned in here,

{% extends "base.html" %}

{% block content %}
    <form action="" method="get">
        {{ filter.form.as_p }}
        <input type="submit" />
    </form>
    {% for obj in filter.qs %}
        {{ obj.name }} - ${{ obj.price }}<br />
    {% endfor %}
{% endblock %}

要点

  1. 通过继承FilterViewclass[=更新SearchResultsListViewclass 59=]
  2. filterset_class 属性添加到您的 SearchResultsListView 视图 class
  3. FilterViewclass自动添加filterset_classclass get_context_data(...) 方法到 filter 键,稍后可以在模板中访问。
  4. 在您的模板中使用 filter.qs 以获得 过滤查询集