是否可以使用基于类的通用 ListView 在单个模板中同时过滤和排序?如果是,如何?

Posted

技术标签:

【中文标题】是否可以使用基于类的通用 ListView 在单个模板中同时过滤和排序?如果是,如何?【英文标题】:Is it possible to Filter and Sort at the same time with in a single template using Class Based Generic ListView? If yes, how? 【发布时间】:2019-12-20 17:29:24 【问题描述】:

我有一个模板,它使用 ListView 在模板中显示所有产品的列表。我有这个链接,用于在我的模型产品上使用不同参数进行排序。

下面是我的模板中的一个 sn-p。

<th>
     <span> Product &nbsp; </span>
        <a class="fa fa-sort-up fa-lg" href="% url 'admin:product_list' %?sort_by=name"></a>
</th>

% for product in products %

<td><a href="% url 'admin:product_update' pk=product.pk %"> product.name </a></td>

引用名为“ProductListView”的 ListView 的 url 是 -

path('products/list/', views.ProductListView.as_view(), name='product_list'),

ProductListView 如下 -

class ProductListView(UserPassesTestMixin, ListView):
    model = Product
    template_name = 'admin_app/product_list.html'
    context_object_name = 'products'

    def get_ordering(self):
        ordering = self.request.GET.get('sort_by')
        return ordering

    def test_func(self):
        return self.request.user.is_superuser


我有一个这样的搜索框

<form method="get" class="form-inline">
                <div class="input-group">
                    <input type="text" name="q" class="form-control" placeholder="Search Products...">
                    <span class="input-group-btn">
                <button type="submit" name="search" id="search-btn" class="btn btn-flat">
                  <i class="fa fa-search"></i>
                </button>
              </span>
                </div>
            </form>

我只想知道如何使用搜索框向我显示查询的路径。我可以将所有查询重定向到不同的页面,但是否可以在同一页面上实现查询?然后对这些查询应用排序。

例如,如果我搜索 example_product,那么我想显示包含此字符串的所有产品/类别,然后我想根据最新的结果对结果进行排序/名称/可用性等

【问题讨论】:

我建议调查 Django-filter django-filter.readthedocs.io/en/master/guide/usage.html 【参考方案1】:
class ProductListView(UserPassesTestMixin, ListView):
    model = Product
    template_name = 'admin_app/product_list.html'
    context_object_name = 'products'

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        query_string = self.request.GET['q'].strip()
        search_fields = [
            'the', 'fields', 'you','want', 'to', 'search'
            ]
        entry_query = get_query(query_string, search_fields)
        items_per_search = 20

        found_entries = qs.filter(entry_query)\
                .distinct().order_by('whateverTheOrderFieldIs'[:items_per_search]

        return found_entries

【讨论】:

以上是关于是否可以使用基于类的通用 ListView 在单个模板中同时过滤和排序?如果是,如何?的主要内容,如果未能解决你的问题,请参考以下文章

Django 通用视图:何时使用 ListView 与 DetailView

我应该如何在函数视图中调用基于类的通用视图

使用Python Django框架创建一个小型博客

Django:基于类的 ListView 中的搜索表单

是否可以通过单个指针访问多态类的不同祖先的虚拟方法?

基于Android官方AsyncListUtil优化经典ListView分页加载机制