【问题标题】:django redirect() with parametersdjango redirect() 带参数
【发布时间】:2012-02-28 20:03:48
【问题描述】:

已经有几个类似的问题被问到了,但是我花了很长时间都找不到我的问题的答案。

在下面的代码中,当我使用参数“username”从“myView”重定向到“anotherView”时,它可以正常工作。但我也需要在此重定向中包含“范围”参数,因为重定向后使用的模板需要此“范围”。每当我尝试这样做时,都会收到几个错误,例如:

-- "不要在调用 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)

【问题讨论】:

    标签: python django


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案2】:

    而不是重定向到目标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)
    

    【讨论】:

    • 如果您这样做,并且有人点击刷新按钮,您的数据会再次被 POST,这是一个不好的做法。
    【解决方案3】:

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

    【讨论】:

    • "range" 变量在 anotherView 的模板中使用。我的意思是在重定向后加载新模板时,我需要在那里范围。但我不想将“范围”变量放在 URL 中,这就是为什么我不把它作为“anotherView”视图的参数。我希望我清楚吗?
    • 它不必在 URL 中,但您需要某种方式在 anotherView 的参数中接受该变量,方法是指定它或使用 *args,如 miki725 建议的那样使用 **kwargs。
    【解决方案4】:

    Redirect 获取要重定向到的视图的名称,以及要传递给其他视图的任何属性。在您的情况下,anotherView 只有两个参数 - 请求和用户名,但是在重定向中您将更多信息传递给它。

    你可以试试这样的:

    def anotherView(request, username, *args, **kwargs):
        ...
    

    这将允许您向它传递更多属性。

    编辑

    在原始视图中这个怎么样:

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

    【讨论】:

    • 即使我添加 *args,我仍然会收到“关键字 arg 之后的非关键字 arg”或“不要在调用 reverse() 时混合 *args 和 **kwargs”错误,** kwargs
    • 不,仍然有错误,但有所不同。这次重定向找不到“anotherView”视图,所以显示“找不到 URL 错误”
    • @mco,如果您有关键字参数,根据这些错误,它们必须排在第一位。所以你必须做 return redirect('anotherView', username=username, item),关键是关键字参数 (username=username) 在位置参数 (item) 之前。希望对您有所帮助。
    【解决方案5】:

    这是一个老问题,但现在这个用例有一个小的 django_url_params 模块。

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 2016-05-23
      • 1970-01-01
      • 2011-03-27
      • 2015-07-13
      • 1970-01-01
      • 2011-10-09
      • 2018-10-22
      相关资源
      最近更新 更多