2017-08-31 35 views
0

這個想法是顯示一個搜索框,用戶可以在其中鍵入地址,該地址由Google自動填充完成。然後,我們保存lat和long參數並重定向到/search(使用POST)或(可能使用GET請求)或者/search?lat=xxx&long=xxx帶有另一個頁面上的表單動作的POST請求返回405,不處理請求。POST

對於第二種情況,與URL參數,我可以用lat = request.GET('lat')

的Index.html形式

<form action="{% url 'users:index' %}" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
<input id="searchTextField" type="text" size="50" placeholder="Enter a location" autocomplete="on" runat="server" /> 
<input type="hidden" id="cityname" name="cityname" /> 
<input type="hidden" id="Lat" name="Lat" /> 
<input type="hidden" id="Lng" name="Lng" /> 
<button type="submit">Submit</button> 
</form> 

當從下拉菜單中用戶挑選時,JavaScript給我的Lat值,Lngcityname。提交後,他們將被重定向到/users/,這是一個ListView和具有以下views.py

class IndexView(ListView): 
    # context_object_name = 'latest_teacher_list' 
    model = Teacher 
    def get_context_data(self, **kwargs): 
     if self.request.method == 'POST' and 'Lat' in self.request.POST: 
      if self.request.POST['Lat'] != '': 
       lat = self.request.POST['Lat'] 
      else: 
       lat = None 
     else: 
      lat = None 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['teacher_list'] = Teacher.objects.all()[:5] 
     context['lat'] = lat 

     return context 

然而,這給了我一個空白頁時,我提交表單。當form action爲空時,它將表單提交到同一頁面,並正確顯示Lat,Long。但是當表單行動是/users/它給了我一個405錯誤。

這樣的事情是可能的,還是我需要做GET請求,例如:通過URL參數爲紐帶,所以不是一個形式,我只是有一個鏈接:

users?lat=xxx&long=xxx 

在那裏我用JS來填充XXX莫名其妙

+0

您是否在視圖中定義了Post方法? – WebGuy

+0

我認爲這可能是問題...讓我檢查 – Roma

+0

此響應代碼(405)可能來自任何數量的問題,但通常最終會導致您使用的URL錯誤或使用錯誤的請求方法。 – WebGuy

回答

2

ListView沒有post方法定義,因此它將返回狀態碼405用於發佈請求。

你可以定義一個post方法,簡單地調用視圖的方法get()

class IndexView(ListView): 
    ... 

    def post(self, request, *args, **kwargs): 
     """Allow post requests for form submissions""" 
     return super(IndexView, self).get(request, *args, **kwargs) 
+0

謝謝!你會推薦使用GET還是POST更好? – Roma

+0

由於您沒有修改數據,因此對於此搜索表單,GET請求可以正常使用。 – Alasdair

+0

還有一件事,我應該向forms.py添加一個表單並驗證它是否類似於https://docs.djangoproject.com/en/1.11/topics/forms/#the-view – Roma

1

必須定義POST方法,但你總是可以設置窗體的方法得到的。這甚至是搜索框更正確的方式,因爲GET用於獲取數據,POST用於提供服務器必須存儲的數據或其他內容,PUT用於更新數據。所以你應該使用GET作爲你的表單方法。此外,如果您使用GET作爲方法,則瀏覽器的前後按鈕也將包含'lat','long'參數,因此您可以使用後退和前進按鈕。不需要鏈接生成。

1

您在html中有一個表單,但您的視圖只能處理獲取請求,您必須更新它並繼承FormView或在所有表單處理代碼中添加post函數。