【问题标题】:Most appropriate way to redirect page after successful POST request in Django在 Django 中成功 POST 请求后重定向页面的最合适方法
【发布时间】:2016-10-15 07:27:15
【问题描述】:

我已经在 Django1.5 中构建了一个视图和一个表单。如果 POST 请求成功(基于我设置的一些值),那么我需要将页面重定向到同时创建的另一个 URL。

否则,如果 POST 不成功,我需要留在同一页面上。现在我已经解决了以下问题,但我很确定这不是最好的方法:

这是我观点的一部分:

def layer_create(request, template='layers/layer_create.html'):
    if request.method == 'GET':
       ....
    elif request.method == 'POST':
       out = {}
       ...
       new_table = 'something that comes from the form'
       if form.is_valid():
         ...
         try:
           ...
           out['success'] = True
         except:
           ...
           out['success'] = False
         finally:
           if out['success']:
            status_code = 200
             # THIS IS THE PART WHICH I THINK I CAN IMPROVE
            template = '/something/workspace:' + new_table + '/metadata' 

       else: # if form not valid
         out['success'] = False
        return render_to_response(template, RequestContext(request, {'form': form}))

这部分代码:

    template = '/something/workspace:' + new_table + '/metadata' 

对我来说似乎很丑陋。但由于我是 Django 的新手,我不知道如何处理这个问题。

【问题讨论】:

    标签: django-views django-1.5


    【解决方案1】:

    关于 Django 1.5 的旁注首先 - 强烈建议您升级到受支持的版本,如 1.8。

    重定向

    对于重定向,您可以使用redirect 快捷方式。 (或HttpResponseRedirect

    from django.shortcuts import redirect
    # out of a view context
    return redirect('/url/to/redirect/to/')
    

    构建网址

    确实 - 正如您所提到的,您对 template = '/something/workspace:' + new_table + '/metadata' 的尝试并不是最干净的方式 :)

    Django 为URL dispatcher 提供了一个非常好的方法。

    这里的完整解决方案太过分了(或者肯定需要有关您的项目结构的更多详细信息) - 我建议您深入了解 Django URL 调度程序。

    简而言之,您会执行以下操作:

    # app/urls.py
    urlpatterns = [
        #...
        url(r'^workspace/(?P<id>[0-9]+)/metadata/$', views.workspace_detail, name='workspace-detail-metadata'),
        #...
    ]
    

    然后您就可以反转您的 URL 模式:

    from django.core.urlresolvers import reverse
    url = reverse('workspace-detail-metadata', kwargs={'id': 123})
    # would result in:
    # .../workspace/123/metadata/
    

    【讨论】:

      【解决方案2】:

      毕竟我使用了“revers”方法如下:

      layer = 'geonode:' + new_table
      return HttpResponseRedirect(
         reverse(
             'layer_metadata',
              args=(
                   layer,
               )))
      

      我的 urls.py 文件包括:

      url(r'^(?P<layername>[^/]*)/metadata$', 'layer_metadata', name="layer_metadata"),
      

      正如here 所述,这是最合适的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 2017-01-10
        • 2016-06-18
        • 2016-12-27
        • 2021-01-11
        相关资源
        最近更新 更多