Django重定向报错:返回index视图时遇意外关键字参数page
问题分析与解决方案
错误原因
你遇到的TypeError: index() got an unexpected keyword argument 'page'错误,根源在于:
- URL路由配置错误:
urls.py中定义的<int:cliente_id>/<str:page>路由,试图把page作为路径参数传递给index视图,但index视图的函数签名只接收request和cliente_id两个参数,不支持page参数。 - 重定向方式错误:
up_load视图里用redirect('myApp:index', cliente_id=cliente_id, page=page)时,Django会把page当作路径参数匹配到错误路由,导致视图接收到未定义的参数。 - 你期望的URL是
/Expedientes/4/?page=1,说明page应该是查询参数(GET参数),而非路径参数。
修复步骤
1. 清理冗余URL路由
修改urls.py,删除包含page的路径路由,因为page不需要作为路径的一部分,而是通过查询参数传递。优化后的路由如下:
from django.urls import path from . import views app_name = 'myApp' urlpatterns = [ path("", views.index, name="index"), path("<int:cliente_id>/", views.index, name="index"), path('up_load/', views.up_load, name='up_load'), ]
2. 修改up_load视图的重定向逻辑
将page作为查询参数拼接到重定向URL中,而非当作路径参数传递。修改后的views.py代码如下:
from django.urls import reverse from django.shortcuts import render, redirect # 确保导入你的表单、Paginator等依赖 def index(request, cliente_id=None): paginator = Paginator(client_list, 15) page_number = request.GET.get("page") page = paginator.get_page(page_number) context = {'cliente_id': cliente_id, 'page': page, 'paginator': paginator } return render(request, 'myApp/index.html', context) def up_load(request): if request.method == 'POST': form = ExpeditensForm(request.POST, request.FILES) cliente_id = request.POST.get('cliente_id') # 去掉默认值'/',用None更合理 page = request.POST.get('page', '1') # 默认页码设为1 if form.is_valid(): form.save() # 根据是否有cliente_id生成基础URL base_url = reverse('myApp:index', kwargs={'cliente_id': cliente_id}) if cliente_id else reverse('myApp:index') # 拼接page查询参数 redirect_url = f"{base_url}?page={page}" return redirect(redirect_url) # 表单无效时的处理:返回原页面并保留页码和cliente_id base_url = reverse('myApp:index', kwargs={'cliente_id': cliente_id}) if cliente_id else reverse('myApp:index') return redirect(f"{base_url}?page={page}")
3. 验证效果
修复后,提交表单成功后会重定向到你期望的URL格式,比如/Expedientes/4/?page=1,index视图会通过request.GET.get("page")正确获取页码,不会再出现参数不匹配的错误。
内容的提问来源于stack exchange,提问作者Enrique Bruzual
相关产品推荐
相关产品推荐

