2011-08-21 110 views
0

嗨Stackoverflow人,Django表單錯誤處理:URL錯誤? is_valid()

我對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 

回答

4

沒有理由讓Django完全按照它設計的方式去做。

您的重定向位於對應於if request.method == 'POST'else子句中。所以,如果這不是表單提交,它纔會生效。換句話說,該視圖永遠不會顯示空的表單。

然後,根據發佈的表單是否有效,顯示兩個模板之一。你現在沒有做任何重定向。

但是,即使你已經要求Django在表單無效時重定向,我懷疑你會得到你想要的結果。這是因爲HTTP(不是Django)的規則說你不能重定向一個POST - 所以你對重定向視圖的請求將是一個GET,沒有任何無效數據或錯誤消息。

0

,除非你告訴瀏覽器做一個重定向,不能更新URL。您在同一個網址上返回了兩個不同的html版本,這可能會讓用戶感到困惑。

你應該做的是有兩個視圖。/add url和add_project_location視圖將接受一個帖子並進行驗證,並保留該url並查看,直到成功。

一旦成功,它會設置一些會話變量,重定向到add_project_details頁面。由於瀏覽器的工作原理,像這樣合併它們是不可能的。