【问题标题】:Call a view within a view with different methods使用不同的方法在视图中调用视图
【发布时间】:2014-05-29 11:29:58
【问题描述】:

我有两个视图,一个用于创建项目,另一个用于生成另一个对象实例的全局视图。在这个视图中,我有一个表单,我想要的是在处理完之后重定向到上一页视图。

基本上:

def view1(request):
    if request.method == 'GET':
         #heavy processing for the context
    return HttpResponse(template.render(context))

def view2(request):
    if request.method == 'POST':
        # Simply add an element
    return view1(request)

这就是我想要做的。问题是,正如您所见,view1 和 view2 的方法不同。我不能使用redirect,因为视图 ​​1 的数据的繁重处理不会完成(我猜)。

有人知道如何将我的 POST 请求转换为 GET 并添加参数吗?

谢谢!

【问题讨论】:

    标签: django redirect view


    【解决方案1】:

    你也可以用这个:

    def view(request):
       if request.method == "POST"
           #add the element
       #heavy processing for the context
    

    这里如果方法是 post,如果 post 可用,它将转到 post 方法,并且您可以在处理中使用您想要的 post 周长

    希望它有用,请投票

    或者你可以使用:

    from django.views.generic.base import View
    class view(View):
       def get(self, request, *args, **kwargs ):
          #heavy processing for the context
    
       def post(self, request, *args, **kwargs):
          #add the element
    

    当你用 post 方法调用上面的 url 时,它会 goto post,而对于其他情况,它会加载 get

    【讨论】:

    • 我觉得它很优雅!谢谢:)
    【解决方案2】:

    是什么让您认为 view1 中的数据处理不会在重定向时完成? HttpRedirectResponse 及其快捷方式redirect() 将简单地给用户的浏览器一个302 HTTP 响应代码,指示浏览器应该对指定的url 发出新请求并显示该页面而不是当前页面。

    总是在成功的 POST 请求后进行重定向实际上是一种很好的做法。否则,如果用户刷新原始页面,POST请求中的数据将被发送和处理两次。使用重定向将重置所有 POST 数据并防止在成功请求后向用户发送重复条目或错误消息。

    要传递参数,只需像使用任何 GET 参数一样将其添加到重定向 url:

    from django.http import QueryDict
    
    parameters = QueryDict(foo='bar', myOtherVar='something_else')
    url = '%s?%s' % (reverse('my_view_name'), parameters.urlencode())
    return redirect(url)
    

    【讨论】:

    • 这就是我所做的,我发现硬编码 url 中的参数很难看,但你这样做的方式很好!
    【解决方案3】:

    在这种情况下,您可以使用 request.REQUEST:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.REQUEST

    但这似乎是个坏主意,因为它将在 django 1.7 中被弃用。您不应该将 GET 参数作为 POST 传递给另一个视图,最好在展位视图中使用 POST。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-02
      • 1970-01-01
      相关资源
      最近更新 更多