这是Django中django-filter的用法(第二部分,类视图篇)
首先
我想以Django-filter的公式网页上最简单的例子为参考,向初学者报告它的工作原理。这篇报告主要包含两个部分。
-
- 関数ビューでの作り方
- クラスビューでの作り方
在这(第二个)部分中,我们将介绍如何使用后者的类视图进行构建。
请参考django-filter的安装和模型创建步骤,方法和《django-filter使用指南(第一部分,函数视图篇)》相同。如果对函数视图的创建方式有疑惑(我也有过),可能最好分离项目。顺便提一下,我的环境是…
-
- python 3.8.6
-
- django 4.1.7
- django-filter 23.1
官方网页:https://django-filter.readthedocs.io/en/stable/
不再啰嗦,我们从路由开始。
路由(类视图)
在我的应用程序(myapp)中创建一个 urls.py 文件,并写入以下内容。
from django.urls import path
from . import views
from myapp.models import Product
urlpatterns = [
path("", views.FilterView.as_view(model=Product), name="product_list"),
]
通常的类视图与使用 as_view() 相同。在这里,FilterView 是继承自 ListView 的形式。此外,官方页面上写着,as_view() 的参数应指定要使用的过滤模型(在这里是 Product)。 ※官方页面上有写from django_filters.views import FilterView,但这样做不起作用。
我也会修改项目中的urls.py文件,这与函数视图相同。
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('myapp.urls')),
]
创建过滤器定义文件(filters.py)。
接下来,在我的应用程序(myapp)中,创建一个名为filters.py的其他文件。
这个文件与函数视图相同。
import django_filters
from .models import Product
class ProductFilter(django_filters.FilterSet):
name = django_filters.CharFilter(lookup_expr='iexact')
class Meta:
model = Product
fields = ['price', 'release_date']
views.py中 ClassView 的定义
在views.py中定义了一个用于显示产品列表(product_list)的类视图。
from django.views.generic import ListView
from .filters import ProductFilter
class FilterView(ListView):
template_name = 'product_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["filter"] = ProductFilter(self.request.GET,
queryset=self.get_queryset())
return context
当然,FilterView与函数视图有很大的区别。FilterView继承了ListView。此外,通过get_context_data()函数,接收搜索关键词参数,并通过ProductFilter在上下文中覆盖了”filter”。然而…在任何地方都找不到筛选数据的filter()方法!
在这里,我尝试以从django_filters.views导入FilterView的形式继承FilterView,但是没有成功。
创建模板文件(product_list.html)。
在我的应用程序(myapp)中创建一个名为templates/myapp的目录,并创建一个名为product_list.html的文件。内容与函数视图相同。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>製品一覧</title>
</head>
<body>
<form method="get">
{% csrf_token %}
{{ filter.form.as_p }}
<input type="submit" />
</form>
{% for obj in filter.qs %}
{{ obj.name }} - ${{ obj.price }} {{ obj.release_date }}<br />
{% endfor %}
</html>
然后,像往常一样,
python manage.py runserver
最后
我之前在函数视图和类视图中介绍了django-filter的使用方法。
我无法成功实现基于django-filter的搜索功能的原因是,
-
- 通常のforms.py や objects.filter を使う方法と混同する
-
- django-filter の中でも関数ビューの実装とクラスビューの実装と混同する
- 基本を理解せず、いきなりDBから動的に取得する choisefield に挑戦して撃沈
这个位置是这样的。 Django框架整体而言都是如此,初学者稍微偏离一点就会陷入错误地狱而放弃。我认为这是因为他们没有掌握大体的方向。
如果这篇文章对那些觉得“实现搜索功能很麻烦和烦人”的人能有一点帮助的话,我会很开心的。毕竟,编程也是从小小的成功体验开始的。
另外,如果你能指出不足之处,我将不胜感激。毕竟,我也是个初学者。