在 Django 中成功 POST 请求后重定向页面的最合适方法
Most appropriate way to redirect page after successful POST request in Django
我已经在 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 1.5 的旁注 - 强烈建议您升级到受支持的版本,如 1.8。
重定向
对于重定向,您可以使用 redirect shortcut. (Or HttpResponseRedirect)
from django.shortcuts import redirect
# out of a view context
return redirect('/url/to/redirect/to/')
建筑物URLs
确实 - 正如您提到的,您对 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/
毕竟我已经使用了"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这是最合适的方法。
我已经在 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 1.5 的旁注 - 强烈建议您升级到受支持的版本,如 1.8。
重定向
对于重定向,您可以使用 redirect shortcut. (Or HttpResponseRedirect)
from django.shortcuts import redirect
# out of a view context
return redirect('/url/to/redirect/to/')
建筑物URLs
确实 - 正如您提到的,您对 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/
毕竟我已经使用了"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这是最合适的方法。