Django重定向带query string报错,如何修改URL模式?
解决Django重定向带Query String的报错问题
问题原因
你当前的写法return redirect('search/?print_id='+str(pk))错误地把包含Query String的完整字符串当成了视图的name参数,Django会去urls里找名为search/?print_id=36的视图模式,自然找不到,所以报错。
解决方案:无需修改URL模式
Query String不属于URL路径的一部分,不需要在urls.py的path中定义,直接通过以下方式生成正确的重定向URL即可:
方式1:手动拼接基础URL与Query String
先通过reverse获取视图的基础URL,再拼接Query参数:
from django.urls import reverse def your_view(request, pk): # 获取search视图的基础URL base_url = reverse('search') # 拼接Query String redirect_url = f"{base_url}?print_id={str(pk)}" return redirect(redirect_url)
方式2:用QueryDict处理参数(更优雅,避免编码问题)
如果有多个Query参数,推荐用QueryDict来处理,自动处理编码:
from django.urls import reverse from django.http import QueryDict def your_view(request, pk): query_params = QueryDict(mutable=True) query_params['print_id'] = str(pk) # 可添加更多参数,比如query_params['keyword'] = 'test' base_url = reverse('search') redirect_url = f"{base_url}?{query_params.urlencode()}" return redirect(redirect_url)
在视图中获取Query参数
在search视图里,直接通过request.GET获取参数即可:
def search(request): print_id = request.GET.get('print_id') # 获取print_id的值,不存在则返回None # 后续业务逻辑
原URL模式保持不变
你的urls.py中的定义无需修改:
path('search/', views.search, name='search'),
内容的提问来源于stack exchange,提问作者Marin Leontenko
相关产品推荐
相关产品推荐

