You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django过滤后分页丢失筛选值问题求助

解决Django分页时保留筛选条件的问题

问题核心在于当前分页链接仅传递page参数,未携带筛选用的GET参数(如field、lookup、value),导致切换分页时丢失筛选状态。以下是具体修复方案:

1. 优化视图逻辑,传递筛选参数到模板

修改CmsView的get_queryset和get_context_data方法,完善筛选逻辑并将筛选参数传递给模板:

class CmsView(ListView):
    queryset = Cmsexport.objects.all().values()
    model = Cmsexport
    template_name = 'table.html'
    context_object_name = 'table'
    paginate_by = 10

    def get_queryset(self):
        queryset = super().get_queryset()
        reset = self.request.GET.get('btn-reset')

        if reset:
            # 重置时直接返回原始数据集,避免基于过滤后的queryset继续操作
            return Cmsexport.objects.all().values()

        # 直接获取参数列表,比单独get后再转getlist更稳妥
        field_list = self.request.GET.getlist('field')
        lookup_list = self.request.GET.getlist('lookup')
        value_list = self.request.GET.getlist('value')

        if field_list and lookup_list and value_list:
            query = dict()
            for f, l, v in zip(field_list, lookup_list, value_list):
                q_key = f.lower().replace(" ", "_") + '__' + l
                query[q_key] = v
            queryset = queryset.filter(**query).values()

        return queryset

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 复制当前GET参数并移除page,避免分页时重复传递
        query_params = self.request.GET.copy()
        query_params.pop('page', None)
        # 生成可直接拼接的查询字符串
        context['query_params'] = query_params.urlencode()
        # 将GET参数绑定到表单,保持筛选后表单的输入状态
        context['form'] = CmsFilterForm(self.request.GET)
        return context

2. 修改模板分页链接,带上筛选参数

在table.html中,所有分页链接的href属性需要拼接筛选参数和page参数:

{% if is_paginated %}
    <div class="row">
        <div class="col-lg-12">
            {% if page_obj.has_other_pages %}
                <nav>
                    <ul class="pagination justify-content-center">

                        {% if page_obj.has_previous %}
                            <li class="page-item">
                                <a class="page-link" href="{{ request.path }}?{% if query_params %}{{ query_params }}&{% endif %}page=1">
                                    First
                                </a>
                            </li>

                            <li class="page-item">
                                <a class="page-link" href="{{ request.path }}?{% if query_params %}{{ query_params }}&{% endif %}page={{ page_obj.previous_page_number }}">
                                    Previous
                                </a>
                            </li>
                        {% endif %}

                        {% for page_number in page_obj.paginator.page_range %}
                            {% if page_number <= page_obj.number|add:3 and page_number >= page_obj.number|add:-3 %}
                                {% if page_obj.number == page_number %}
                                    <li class="page-item active">
                                        <a class="page-link" href="{{ request.path }}?{% if query_params %}{{ query_params }}&{% endif %}page={{ page_number }}">
                                            {{ page_number }}
                                        </a>
                                    </li>
                                {% else %}
                                    <li class="page-item">
                                        <a class="page-link" href="{{ request.path }}?{% if query_params %}{{ query_params }}&{% endif %}page={{ page_number }}">
                                            {{ page_number }}
                                        </a>
                                    </li>
                                {% endif %}
                            {% endif %}
                        {% endfor %}

关键说明:

  • query_params会自动携带所有筛选参数(如field=xxx&lookup=yyy&value=zzz),分页时不会丢失
  • {% if query_params %}{{ query_params }}&{% endif %}处理无筛选参数的场景,避免URL出现多余的&符号
  • 表单绑定self.request.GET后,筛选操作完成后表单会自动填充之前的输入值,提升用户体验

内容的提问来源于stack exchange,提问作者user15106307

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:06:08