求助:表单提交成功后重定向至带PK的前一页实现问题
问题:表单提交后重定向回带PK的原页面
我正在实现一个表单,需要在提交成功后将用户重定向到带有主键(PK)的前一页。示例原页面地址:http://127.0.0.1:8000/object/update/8/
首次尝试代码
def get_success_url(self, **kwargs): return reverse_lazy('task_update:update', kwargs={'id': self.object.id})
当前尝试及错误
我尝试让表单加载时携带原页面的PK(表单本身不需要PK,示例表单地址:http://127.0.0.1:8000/tag/create/8/),并在get_success_url中用该PK生成原页面地址,代码如下:
def get_success_url(self, **kwargs): return reverse_lazy('task_update', self.kwargs.get('pk'))
但出现以下错误:
包含的URLconf '8'中似乎没有任何模式。如果您在文件中看到带有有效模式的'urlpatterns'变量,那么问题可能是由循环导入引起的。
需求目标
用户从http://127.0.0.1:8000/object/update/8/跳转至标签创建页,提交表单后需返回原页面。
解决方案
你的错误出在reverse_lazy的调用方式上:第二个参数如果是URL参数,必须通过kwargs关键字参数传递,不能直接传值。正确写法如下:
def get_success_url(self, **kwargs): # 确保URL名称与你的URL配置一致,比如'task_update:update'对应原页面的路由 return reverse_lazy('task_update:update', kwargs={'pk': self.kwargs.get('pk')})
同时要确认你的URL配置中,task_update:update对应的路由是接受pk参数的,示例配置如下:
# urls.py 示例 path('object/update/<int:pk>/', UpdateTaskView.as_view(), name='update'),
如果原页面路由用的参数名是id而非pk,把kwargs={'pk': ...}改成kwargs={'id': ...}即可。
另外还有一种更通用的方案:跳转表单页时,把原页面URL作为next参数传递(比如跳转链接加?next=/object/update/8/),然后在get_success_url中读取该参数:
def get_success_url(self): next_url = self.request.GET.get('next') if next_url: return next_url # 兜底的默认重定向地址 return reverse_lazy('some_default_page')
这种方式无需在URL中携带PK,适配性更强,适合原页面URL结构可能变化的场景。
内容的提问来源于stack exchange,提问作者Wamz
相关产品推荐
相关产品推荐

