【问题标题】:How to use django-filter with a ListView class view for search?如何使用 django-filter 和 ListView 类视图进行搜索?
【发布时间】:2019-12-25 17:06:16
【问题描述】:

我有一个过滤器:

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'

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

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

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

【问题讨论】:

    标签: python django django-filter


    【解决方案1】:

    我认为Generic view & configuration 部分下的django-filter 文档中的所有内容都有很好的记录。

    django_filters.views.FilterView 类类似于 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. 通过继承 FilterView 类来更新 SearchResultsListView
    2. filterset_class 属性添加到您的 SearchResultsListView 视图类
    3. FilterView类自动将get_context_data(...)方法中的filterset_class类添加到filter 键,稍后可在模板中访问。
    4. 在您的模板中使用 filter.qs 以获取过滤后的查询集

    【讨论】:

    • 非常感谢,我只需要一个完整的例子。只是为了确保,我不需要表单中的 csrf_token?
    • csrf_tokenHTTP POST 请求有关,过滤器通常适用于 HTTP GET。所以,在你的情况下,我们不需要它
    • 感谢补充关键点,非常有用!
    猜你喜欢
    • 2021-04-13
    • 2012-05-15
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    相关资源
    最近更新 更多