在Django中成功发送POST请求后重定向页面的最合适方法

时间:2016-06-14 13:56:51

标签: django-views django-1.5

我在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的新手,我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分: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'),
    #...
]

然后您就可以撤消您的网址格式:

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

答案 1 :(得分:0)

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

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

我的urls.py文件包含:

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

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