这是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-filter3.jpg

最后

我之前在函数视图和类视图中介绍了django-filter的使用方法。
我无法成功实现基于django-filter的搜索功能的原因是,

    • 通常のforms.py や objects.filter を使う方法と混同する

 

    • django-filter の中でも関数ビューの実装とクラスビューの実装と混同する

 

    基本を理解せず、いきなりDBから動的に取得する choisefield に挑戦して撃沈

这个位置是这样的。 Django框架整体而言都是如此,初学者稍微偏离一点就会陷入错误地狱而放弃。我认为这是因为他们没有掌握大体的方向。
如果这篇文章对那些觉得“实现搜索功能很麻烦和烦人”的人能有一点帮助的话,我会很开心的。毕竟,编程也是从小小的成功体验开始的。
另外,如果你能指出不足之处,我将不胜感激。毕竟,我也是个初学者。

广告
将在 10 秒后关闭
bannerAds