Python 带有参数的django redirect()

Python 带有参数的django redirect(),python,django,Python,Django,已经有好几个类似的问题被问过了,但我花了好几个小时才找到问题的答案 在下面的代码中,当我使用参数“username”从“myView”重定向到“anotherView”时,它可以正常工作。但是我也需要在这个重定向中包含“range”参数,因为这个“range”对于重定向后使用的模板是必需的。每当我尝试执行此操作时,都会出现以下错误: --“在调用reverse()时,不要混合使用*args和**kwargs” 有没有办法按照我想要的方式来处理这件事 def myView(request):

已经有好几个类似的问题被问过了,但我花了好几个小时才找到问题的答案

在下面的代码中,当我使用参数“username”从“myView”重定向到“anotherView”时,它可以正常工作。但是我也需要在这个重定向中包含“range”参数,因为这个“range”对于重定向后使用的模板是必需的。每当我尝试执行此操作时,都会出现以下错误:

--“在调用reverse()时,不要混合使用*args和**kwargs”

有没有办法按照我想要的方式来处理这件事

   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)

重定向获取要重定向到的视图的名称,以及要传递到另一个视图的任何属性。在您的情况下,
另一个视图
只有两个参数-request和username,但在重定向中,您将向其传递更多信息

您可以尝试以下方法:

def anotherView(request, username, *args, **kwargs):
    ...
这将允许您向其传递更多属性

编辑

在原始视图中,这个如何:

kwargs = {"range": range(int(layout))}
return redirect('anotherView', username=request.user.username, **kwargs)

您试图将“range”变量传递给什么?另一种观点?没有参数可以接受它。我想您可能正在寻找该函数,但很难说。

重定向
只是一个包装器,它围绕着
HttpResponseRedirect
自动调用
reverse
,以便您创建要重定向到的URL。因此,您传递给它的参数不是任意的,它们必须与您传递给
reverse
的参数相同,特别是,只有创建URL所需的参数

许多人似乎很难理解数据不能随意地传递给视图。HTTP是一种无状态协议:每个请求都独立存在,就像用户从未访问过站点的任何其他页面一样。创建会话的概念是为了给站点等有凝聚力的单元提供一种“状态”感。对于会话,数据存储在某种形式的持久存储中,并将用于查找该数据的“键”提供给客户端(通常是用户的浏览器)。在下一次页面加载时,客户机将密钥发送回服务器,服务器使用密钥查找数据以显示状态


因此,如果您需要一个视图中的数据在另一个视图中可用,则需要将其添加到会话中,执行重定向,并从下一个视图中查找会话中的数据。

而不是重定向到目标url,只需直接调用目标视图函数:

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)

这是一个老问题,但现在有一个小模块用于此用例

我不断得到“关键字arg之后的非关键字arg”或“在调用reverse()时不要混合使用*args和**kwargs”错误,即使我添加*args,**kwargsnope仍然错误,但不同。这次重定向找不到“anotherView”视图,所以显示“URL未找到错误”@mco,根据这些错误,如果你有关键字参数,它们必须排在第一位。因此,您必须执行return-redirect('anotherView',username=username,item),关键是关键字参数(username=username)位于位置参数(item)之前。希望对您有所帮助。“range”变量用于另一个视图的模板中。我的意思是,当重定向后加载新模板时,我需要在那里设置范围。但我不想把“range”变量放在URL中,这就是为什么我不把它作为“anotherView”视图的参数。我希望我很清楚?它不必出现在URL中,但您需要某种方式在另一个视图的参数中接受该变量,或者指定它,或者使用*args、**kwargs,正如miki725所建议的那样。感谢您的不同观点。我可以用这种方法解决这个问题。太好了!这里是关于会话的Django文档:我无法编辑@Régis B对会话的评论,但是版本1.5现在给出了404。这是1.11。如果你这样做,有人点击刷新按钮,你的数据就会再次发布,这是一个糟糕的做法。