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">« 首页</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 }}">末页 »</a> {% endif %} </span> </div>
内容的提问来源于stack exchange,提问作者Gleb Makarenko
相关产品推荐
相关产品推荐

