如何使用带有 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 %}
要点
- 通过继承
FilterView
class[=更新SearchResultsListView
class 59=]
- 将
filterset_class
属性添加到您的 SearchResultsListView
视图 class
FilterView
class自动添加filterset_class
class get_context_data(...)
方法到 filter
键,稍后可以在模板中访问。
- 在您的模板中使用
filter.qs
以获得 过滤查询集
我有一个过滤器:
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 %}
要点
- 通过继承
FilterView
class[=更新SearchResultsListView
class 59=] - 将
filterset_class
属性添加到您的SearchResultsListView
视图 class FilterView
class自动添加filterset_class
classget_context_data(...)
方法到filter
键,稍后可以在模板中访问。- 在您的模板中使用
filter.qs
以获得 过滤查询集