django-tables2结合django-filter如何记住URL参数?附视图代码
如何在Django的FilteredReclamationListView中记住筛选参数
当然可以实现这个需求!我们可以结合session和request.GET来保存用户的筛选状态,这样用户跳转回来时就能自动恢复之前的查询结果。下面是具体的实现步骤:
第一步:保存筛选参数到Session
在你的视图中,当用户进行筛选操作时(也就是request.GET存在参数的时候),把这些参数保存到session里。我们可以重写get方法来完成这件事:
class FilteredReclamationListView(FilterView, SingleTableView): table_class = ReclamationTable model = ReclamationMainModel template_name = 'reclamation_table/index.html' filterset_class = ReclamationFilter table_pagination = { 'per_page': 50 } def get(self, request, *args, **kwargs): # 当有筛选参数时,将参数编码后存入session if request.GET: request.session['reclamation_filters'] = request.GET.urlencode() return super().get(request, *args, **kwargs) def get_table_data(self): return self.object_list def get_queryset(self): return self.model.objects.filter(archive=False).order_by('-id')
第二步:返回视图时恢复筛选参数
当用户访问这个视图但没有携带任何GET参数时,我们从session里取出之前保存的参数,重定向到带参数的URL。继续在get方法中补充逻辑:
def get(self, request, *args, **kwargs): # 如果没有GET参数,但session里有保存的筛选条件,就重定向到带参数的页面 if not request.GET and 'reclamation_filters' in request.session: return redirect(f"{request.path}?{request.session['reclamation_filters']}") # 有筛选参数时更新session中的保存值 if request.GET: request.session['reclamation_filters'] = request.GET.urlencode() return super().get(request, *args, **kwargs)
第三步:确保分页操作保留筛选参数
如果你的表格用到了分页,需要保证点击分页按钮时筛选参数不会丢失。在Django-tables2的模板中,修改分页链接的生成逻辑,带上当前的GET参数:
{% load django_tables2 %} {% block pagination %} {% if table.page %} <nav aria-label="Page navigation"> <ul class="pagination"> {% for page in table.paginator.page_range %} <li class="page-item {% if table.page.number == page %}active{% endif %}"> <a class="page-link" href="?{{ request.GET.urlencode }}&page={{ page }}">{{ page }}</a> </li> {% endfor %} </ul> </nav> {% endif %} {% endblock %}
这样用户切换分页时,筛选参数会自动被携带,session也会同步更新最新的参数状态。
额外优化:清理无效的筛选参数
如果需要清理过期的筛选记录(比如用户登出时),可以在登出视图中移除session里的对应键:
def logout_view(request): # 移除保存的筛选参数,避免无效数据占用空间 request.session.pop('reclamation_filters', None) auth.logout(request) return redirect('home')
这样就完美实现了用户跳转其他视图后返回时,能看到上次查询/筛选结果的需求啦!
内容的提问来源于stack exchange,提问作者Aule
相关产品推荐
相关产品推荐

