2015-10-12 22 views
1

我試圖創建一個系統,某些頁面無法訪問,除非請求來自特定的位置。我目前有一切工作,除了在檢查位置並且請求被重定向到下一個視圖之後,下一個視圖的表單不能正確發佈。它仍在嘗試發佈位置數據表單。在Django中重定向後發佈的方法不工作

你會明白我的意思更在我views.py

def add(request): 
    if request.method == 'POST': 
     form = StudentModelForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/') 
    else: 
     form = StudentModelForm() 
    context_data = {'form': form} 
    return render(request, 'add.html', context_data) 


def location_check_add(request): 
    if request.method == 'POST' and 'lat' in request.POST: 
     user_lat = request.POST.get('lat') 
     user_lon = request.POST.get('lon') 
     if good_location(user_lat,user_lon): 
      return add(request) 
     else: 
      return render(request, 'location.html') 
    return render(request, 'checking.html') 

所以我想重定向到add()視圖如果good_location是真實的。它重定向正確,但當用戶試圖張貼表格時012jdjango認爲它再次提交location_check_add中的表單。

編輯:添加urls.py參考

import users.views 

urlpatterns = patterns('', 
    url(r'^$', users.views.index, name = 'index'), 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^add/', users.views.location_check_add, name = 'add'), 
) 

回答

0

好吧!經過大量的文檔搜索和搜索,我發現了Django的會話功能。文檔瀏覽:

Documentation

在結束我的代碼最終看起來像:

def add(request): 
    if request.session.get('at_work', False): 
     if request.method == 'POST': 
      form = StudentModelForm(request.POST) 
      if form.is_valid(): 
       form.save() 
       return HttpResponseRedirect('/') 
     else: 
      form = StudentModelForm() 
     context_data = {'form': form} 
     return render(request, 'add.html', context_data) 
    else: 
     return redirect(location_check_add) 

def location_check_add(request): 
    if request.method == 'POST' and 'lat' in request.POST: 
     user_lat = request.POST.get('lat') 
     user_lon = request.POST.get('lon') 
     if good_location(user_lat,user_lon): 
      request.session['at_work'] = True 
      return redirect(add) 
     else: 
      return render(request, 'location.html') 
    return render (request, 'checking.html') 

基本上我就在會話變量「at_work」傳遞給確認位置是正確的渲染之前頁面在add()視圖中。然後,我可以使用常規重定向功能,因爲我可以在urls.py中添加一個指向add()的url,而不必繞過位置檢查。

0

您需要重定向,不只是調用視圖。

if good_location(user_lat,user_lon): 
     return redirect('add') 
+0

現在我擁有它,以便我的網站com/addd url指向app.views.location_check_add。因此,當我嘗試「返回重定向('add')時,它將我帶回到位置檢查頁面。我現在這樣使用,所以有人無法在瀏覽器中輸入website.com/add並跳到」添加「。 html「沒有位置檢查,有沒有更好的方法來設置它?我將我的urls.py添加到原始問題以供參考 –

+0

而不是調用users.views.location_check_add URL添加/你可以只有一個視圖中,你首先檢查視圖內的位置的有效性,然後顯示內容,如果有效,否則不顯示內容或重定向到另一個錯誤頁面或其他東西!! –

+0

@ManjunathSatyamurthy所以我試過你的建議,因爲它看起來像最好的方式去在這種情況下,但我仍然得到同樣的錯誤,第一次POST(在這種情況下,座標形式)繼續提交,即使它應該是add()形式。我認爲這是因爲第一個請求.POST正在被轉發到下一個視圖,而不是像正確的重定向那樣的全新請求。 –