如何在Django的views.py中实现带有int类型参数的URL重定向?
解决Django带Int参数的重定向问题
嘿,我来帮你搞定这个重定向的坑!你现在的问题主要是没搞清楚Django URL反向解析的正确用法,而且代码里还有几个小笔误得先修正,咱们一步步来:
首先,先修正代码里的小错误
你的视图函数参数是user_id,但在else分支里写了user = User.objects.get(id=job_id)——这里的job_id明显是笔误,应该改成user_id,不然会报变量未定义的错误。另外,错误分支里你并没有获取user对象,所以user.id根本没法用,直接用视图传入的user_id就够了。
正确的重定向写法(两种方案)
你的urls.py里配置了'edit/<int:user_id>',对应views.update(你之前说对应views.edit,这里得保持一致哦),下面两种方法都能解决你的问题:
方案1:使用命名URL(推荐,维护更方便)
首先给你的URL路径加个name,这是Django推荐的反向解析方式,以后改URL路径不用改视图代码:
# urls.py from django.urls import path from . import views urlpatterns = [ # 给这个路径加上name='update_user' path('edit/<int:user_id>', views.update, name='update_user'), # 其他URL... ]
然后在视图里,用redirect配合这个name和参数:
# views.py里的错误分支 return redirect('update_user', user_id=user_id) # 或者直接传位置参数,效果一样:return redirect('update_user', user_id)
方案2:直接拼接URL字符串(不推荐,但能临时解决)
如果你不想用命名URL,那得用f-string把user_id的实际值拼进URL里,注意不要写int:,因为那是Django URL配置里的语法,不是实际浏览器访问的URL内容:
return redirect(f'/edit/{user_id}')
修正后的完整视图代码
把上面的修改整合后,你的update函数应该是这样的:
def update(request, user_id): errors = User.objects.empty_validator(request.POST) if len(errors): for key, value in errors.items(): messages.error(request, value) # 这里用推荐的命名URL反向解析 return redirect('update_user', user_id=user_id) # 或者用拼接URL的方式:return redirect(f'/edit/{user_id}') else: if 'user_id' in request.session: # 修正job_id为user_id user = User.objects.get(id=user_id) user.title = request.POST['title'] user.save() return redirect('/dashboard') return redirect('/')
为什么你之前的写法无效?
你试的redirect('/edit/int:user_id')、('/edit/int:user.id')这些写法都是错的:
int:是Django URLconf里的路径转换器,用来告诉Django匹配整数类型的参数,不是实际URL的一部分,浏览器请求的URL里是具体的数字(比如/edit/1),所以写int:会导致路径找不到。- 错误分支里你没有获取
user对象,所以user.id会直接报错,即使获取了,也不如直接用视图传入的user_id简洁。
内容的提问来源于stack exchange,提问作者Crystal
相关产品推荐
相关产品推荐

