大家好,
我被Django的表单处理激怒了,如果表单提交到新页面并且表单验证失败。我打算返回到先前提交的表单,并显示错误消息以进行更正。
将显示错误消息,但url链接没有更改。我如何改变is_valid()语句*的*else语句,以便重定向到以前的形式?
谢谢你的建议!
urls . py
urlpatterns = patterns("",
url(r"^add/$", "remap.views.add_project", name="add_project_location"),
url(r"^add/details/$", "remap.views.add_project_details", name="add_project_details"),
)
views.py
def add_project_details(request):
if request.method == 'POST': # If the form has been submitted...
locationForm = LocationForm(request.POST)
if locationForm.is_valid(): # All validation rules pass
locality = locationForm.cleaned_data['locality']
state = locationForm.cleaned_data['state']
country = locationForm.cleaned_data['country']
projectForm = ProjectForm(initial = {
'locality': locality,
'state': state,
'country': country,
})
return render_to_response('map/add_project_details.html', {
'projectForm': projectForm,
}, context_instance = RequestContext(request))
else:
print locationForm.errors
return render_to_response('map/add_project_location.html', {
'locationForm': locationForm,
}, context_instance = RequestContext(request))
else:
return HttpResponseRedirect('../') # Redirect to the location reg if site is requested w/o proper location
我们没有理由对Django做的事情感到恼火。
您的重定向在if request.method == 'POST'
对应的else
子句上。因此,只有当这不是一个表单提交时,它才会生效。换句话说,该视图永远不会实际显示空表单。
然后,根据post表单是否有效,显示两个模板中的一个。此时您没有做任何重定向。
然而,即使你要求Django在表单无效时重定向,我也怀疑你会得到你想要的结果。这是因为HTTP(而不是Django)的规则说你不能重定向POST -所以你对重定向视图的请求将是一个GET,没有任何无效数据或错误消息。
你不能更新url,除非你告诉浏览器做重定向。你在同一个url上返回了两个不同的html版本,这会让用户感到困惑。
你应该做的是有两个视图。/add url和add_project_location视图将接受一个post并进行验证,并保持在该url和视图上,直到成功。
成功后,它将设置一些会话变量,重定向到add_project_details页面。由于浏览器的工作方式,像这样合并它们是不可能的。