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

Django中提交回答后如何重定向到对应分页页面?

Django问答系统:提交回答后跳转到新回答所在分页的解决办法

解决思路

要搞定这个问题,核心就是先算出新回答在第几页,然后重定向的时候把这个页码作为page参数拼到问题详情页的URL后面就行。别去改URL规则,因为你本来就是用GET参数做分页的,直接传参数就够了。

具体操作步骤

1. 在提交回答的视图里计算页码

保存新回答之后,先统计该问题下的总回答数,再结合你设置的每页显示数量,算出新回答所在的页码。注意排序逻辑要和详情页完全一致,不然页码会算错:

from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404, redirect, render

def submit_answer(request, question_id):
    question = get_object_or_404(Question, id=question_id)
    if request.method == 'POST':
        form = AnswerForm(request.POST)
        if form.is_valid():
            answer = form.save(commit=False)
            answer.question = question
            answer.author = request.user
            answer.save()
            
            # 按你详情页的排序方式取所有回答,比如新回答放最前面就用'-created_at'
            answers = question.answer_set.all().order_by('-created_at')
            # 这里的10是你每页显示的数量,要和详情页保持一致
            paginator = Paginator(answers, 10)
            
            # 计算页码:如果新回答在第一页(倒序),那页码就是1;如果是正序(旧到新),新回答在最后一页,直接取总页数
            # 下面是倒序的情况,根据你的实际排序改:
            page_number = 1
            # 正序的话用这个:page_number = paginator.num_pages
            
            # 重定向到详情页并带上page参数,两种写法选顺手的
            return redirect('question_detail', question_id=question.id) + f'?page={page_number}'
            # 另一种写法:
            # from django.urls import reverse
            # return redirect(f"{reverse('question_detail', args=[question.id])}?page={page_number}")
    # GET请求显示表单
    form = AnswerForm()
    return render(request, 'submit_answer.html', {'form': form, 'question': question})

2. 确保详情页视图正确接收page参数

详情页的视图要正常处理page这个GET参数,初始化分页对象,排序逻辑必须和提交视图完全一致:

def question_detail(request, question_id):
    question = get_object_or_404(Question, id=question_id)
    # 排序必须和提交视图里的完全一样!
    answers = question.answer_set.all().order_by('-created_at')
    paginator = Paginator(answers, 10)
    # 取page参数,默认显示第一页
    page_number = request.GET.get('page', 1)
    page_obj = paginator.get_page(page_number)
    
    return render(request, 'question_detail.html', {
        'question': question,
        'page_obj': page_obj,
        'answer_form': AnswerForm()
    })

3. 踩坑排查

  • 排序逻辑不一致:提交视图和详情页的回答排序必须一模一样,一个倒序一个正序的话,新回答的位置完全反了,页码肯定错。
  • 每页数量不一致:两个视图里Paginator的第二个参数(每页条数)要相同,不然总页数计算会出错。
  • 重定向参数传错:别搞什么URL路径参数(比如/questions/123/5),就直接在重定向的URL后面拼?page=xxx,这才是你原来分页的逻辑。

模板里的小细节

确保表单提交的地址是对的,分页组件正常渲染page_obj:

<!-- 提交回答的表单 -->
<form method="post" action="{% url 'submit_answer' question.id %}">
    {% csrf_token %}
    {{ answer_form.as_p }}
    <button type="submit">提交回答</button>
</form>

<!-- 分页导航 -->
<div class="pagination">
    <span class="step-links">
        {% if page_obj.has_previous %}
            <a href="?page=1">&laquo; 首页</a>
            <a href="?page={{ page_obj.previous_page_number }}">上一页</a>
        {% endif %}

        <span class="current">
            第 {{ page_obj.number }} 页 / 共 {{ page_obj.paginator.num_pages }} 页
        </span>

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">下一页</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">末页 &raquo;</a>
        {% endif %}
    </span>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:12:09