如何在 ListView 类视图中使用 django-filter 进行搜索?

S.D*_*S.D 5 python django django-filter

我有一个过滤器:

class BookFilter(django_filters.FilterSet):

    class Meta:
        model = Book
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

和一个 ListView 来查看结果:

class SearchResultsListView(ListView):
    model = Book
    context_object_name = 'book_list'
    template_name = 'book/search_results.html'
Run Code Online (Sandbox Code Playgroud)

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

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

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

JPG*_*JPG 7

我认为所有内容都在Generic view & configuration部分下的django-filter文档中得到了很好的记录。 该班是类似Django的,你可以用它来筛选结果。

django_filters.views.FilterViewListView

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
Run Code Online (Sandbox Code Playgroud)

按照此处所述对您的book/search_results.html模板进行一些更改,

{% 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 %}
Run Code Online (Sandbox Code Playgroud)

关键点

  1. SearchResultsListView通过继承FilterView类更新类
  2. filterset_class属性添加到您的SearchResultsListView视图类
  3. FilterView类自动添加filterset_class类中的get_context_data(...)方法filter的关键,它可以在模板访问后。
  4. filter.qs在您的模板中使用以获取过滤的查询集

  • 感谢您提供额外的要点,非常有用! (2认同)