Django 分页错误

0 投票
2 回答
542 浏览
提问于 2025-04-16 14:10

我创建了一个Django应用程序。在我的应用中,有一个过滤功能,可以把筛选后的数据展示在一个单独的页面上。

现在我想给这个过滤后的列表页面加上分页功能。可是,在实现这个功能的时候,我遇到了一个错误。分页的部分在页面底部显示出来了,并且显示了正确的页数和“下一页”的按钮。

但是,当我点击分页器中的“下一页”时,它却把我重定向到了我的主页(/employeeList)。

我猜这可能是因为我在某些情况下使用了一个 HttpResponseRedirect (return HttpResponseRedirect('/employeeList')) 的代码,这个代码是在 filter() 函数里面的。我会把我的filter()函数和分页的HTML代码贴出来。

def filter(request):
    val2=''
    val3=''
    newData=''
    if request.GET.has_key('choices'):
        val2=request.GET.get('choices')

    if request.GET.has_key('textField'):
        val3=request.GET.get('textField')

    if request.POST:
        val2=request.POST.get('choices')
        val3=request.POST.get('textField')
    if val2=='Designation':
        newData = EmployeeDetails.objects.filter(designation=val3)
        flag=True
    elif val2=='Name':
        newData = EmployeeDetails.objects.filter(userName__icontains=val3)
        flag=True
    elif val2=='EmployeeID':
        newData = EmployeeDetails.objects.filter(employeeID=val3)
        flag=True
    elif val2=='Project':
        newData = EmployeeDetails.objects.filter(project=val3)
        flag=True
    elif val2=='DateOfJoin':
        newData = EmployeeDetails.objects.filter(dateOfJoin=val3)
        flag=True
    else:
        return HttpResponseRedirect('/employeeList')

    if request.POST.get('sortAscendValue'):
        newData = newData.order_by('userName')
    elif request.POST.get('sortDescendValue'):
        newData = newData.order_by('-userName')
    paginator = Paginator(newData, 10)
    try:
         page = int(request.GET.get('page', '1'))
    except ValueError:
        page = 1
    try:
        contacts = paginator.page(page)
    except (EmptyPage, InvalidPage):
        contacts = paginator.page(0)

    return render_to_response('filter.html',{'newData':newData,'emp_list': contacts,'val2':val2,'val3':val3,'flag':flag,'emp_list': contacts})

filter.html

<div class="pagination" >
    <span class="step-links">
        {% if emp_list.has_previous %}
            <a href="?page={{ empl_list.previous_page_numbe }}">Previous</a>
        {% endif %}

        <span class="current">
            Page {{ emp_list.number }} of {{ emp_list.paginator.num_pages }}.
        </span>

        {% if emp_list.has_next %}
            <a href="?page={{ emp_list.next_page_number }}">Next</a>
        {% endif %}
    </span>
</div>

2 个回答

2

听起来你已经找到了下一个链接重定向到主页的原因:

  • 下一个链接大概是像 ?page=2 这样的格式。
  • 没有 choices 这个获取变量,也没有 POST 变量,所以当进入你那段长长的 ifelif 语句时,val2 的值会是 ''(空字符串)。
  • 因此,else: return HttpResponseRedirect('/employeeList') 这行代码会被执行,用户就会被重定向到你的主页。

我不太明白你什么时候或者为什么会想让过滤代码重定向到主页,但似乎有几个选择:

  • 去掉 else: return HttpResponseRedirect('/employeeList') 这一行,然后在你想重定向用户的时候使用不同的条件。

  • 找个办法让那个 else 条件不匹配下一个链接。

对于第二个选项,你可以在 else 之前加上以下代码:

elif request.GET.get('page', False):
    pass

这确实不是一个很优雅的解决方案,但看起来是最快(也是最简单粗暴)的办法,而不需要重构你的代码。

2

尝试一下

{% if emp_list.has_next %}
  <a href="?page={{ emp_list.next_page_number }}&choices={{ val2 }}>Next</a>
{% endif %}

撰写回答