是否可以使用基于类的通用 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 </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 在单个模板中同时过滤和排序?如果是,如何?的主要内容,如果未能解决你的问题,请参考以下文章