已经有几个类似的问题已经提出但是在花了很长时间后我找不到问题的答案。
在下面的代码中,当我使用参数“username”从“myView”重定向到“anotherView”时,它可以正常工作。但我需要在此重定向中包含“range”参数,因为重定向后使用的模板需要此“范围”。每当我尝试做的时候,我会遇到几个错误:
- “不要将* args和** kwargs混合调用reverse()”
有没有办法以我想要的方式管理它?
def myView(request):
if request.user.is_authenticated():
if request.method == 'POST':
#my code comes here
....
return redirect('anotherView', username=request.user.username, {"range": range(int(layout))})
def anotherView(request,username):
if request.user.is_authenticated():
#my code comes here
....
return redirect(something)
答案 0 :(得分:20)
redirect
只是HttpResponseRedirect
的一个包装器,会自动调用reverse
来创建重定向到的URL。因此,传递给它的参数不是任意的,它们必须与传递给reverse
的参数相同,具体而言,只需要创建URL所需的参数。
许多人似乎很难理解数据不能随意传递给视图。 HTTP是一种无状态协议:每个请求都存在于自己的协议上,就像用户从未访问过该站点的任何其他页面一样。创建会话的概念是为了向诸如站点之类的内聚单元提供“状态”感。通过会话,数据以某种形式的持久存储和“密钥”存储,以查找将数据提供给客户端(通常是用户的浏览器)。在下一页加载时,客户端将密钥发送回服务器,服务器使用它来查找数据以显示状态。
因此,如果您需要来自另一个视图的数据,则需要将其添加到会话中,进行重定向,并从下一个视图中查找会话中的数据。
答案 1 :(得分:1)
不是直接重定向到目标网址,而是直接调用目标视图功能:
def myView(request):
if request.user.is_authenticated():
if request.method == 'POST':
#my code comes here
....
return anotherView(request, username, range)
def anotherView(request,username,range):
if request.user.is_authenticated():
#my code comes here
....
return HttpResponse(something)
答案 2 :(得分:0)
重定向将视图的名称重定向到,以及要传递给另一个视图的任何属性。在您的情况下,anotherView
只有两个参数 - 请求和用户名,但是在重定向中您传递了更多信息。
您可以尝试以下内容:
def anotherView(request, username, *args, **kwargs):
...
这将允许您传递更多属性。
修改
在原始视图中如何:
kwargs = {"range": range(int(layout))}
return redirect('anotherView', username=request.user.username, **kwargs)
答案 3 :(得分:0)
你想把“范围”变量传递给什么? anotherView?没有参数可以接受它。我想你可能正在寻找reverse()函数,但这很难说。
答案 4 :(得分:0)
这是一个古老的问题,但是现在有一个小型django_url_params模块用于该用例。