2017-05-24 116 views
0

我正在使用Django,我需要發送緯度和縱向使用AJAX每次我點擊一個元素。如何使用AJAX發送經緯度到Django服務器

這是我在我的模板:

{% block js %} 
    <script> 
     var latitud; 
     var longitud; 

     if ("geolocation" in navigator) { 
     navigator.geolocation.getCurrentPosition(
      function (position) { 
       console.log('Position has been set successfully'); 
       latitud = position.coords.latitude; 
       longitud = position.coords.longitude; 
      }, function (error) { 
       console.log('Position could not be obtained.') 
      }); 
     } 
     dataToSend = { 
      "fbpost": $("input[name=fb-post]").is(':checked'), 
     "latitude": latitud, 
     "longitude": longitud 
     }; 

     var csrftoken = "{{ csrf_token }}"; 

     function csrfSafeMethod(method) { 
     // these HTTP methods do not require CSRF protection 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
     } 

     $.ajaxSetup({ 
     beforeSend: function(xhr, settings) { 
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", csrftoken); 
      } 
     } 
     }); 

     $.ajax(
     { 
      type: "POST", 
      dataType: 'json', 
      url: {% url 'pledges:home' %}, 
      data: JSON.stringify(dataToSend), 
      success: function (msg) { 
      console.log('Succeeded!');    
      }, 
      error: function (err) { 
      console.log('Error!'); 
      } 
     }); 
    }); 
    </script> 
{% endblock %} 

但是,當我試圖讓的latitud的價值在我看來,我得到一個錯誤,因爲它未發送:

KeyError: 'latitude'

這是我在我的視圖代碼:

@login_required 
def home(request): 
    request_body = json.loads(request.body.decode('utf-8')) 
    print(request_body['latitude']) 

    # mode code 

    return render(request, 'pledges/home.html', context) 

我怎樣才能做到這一點,我知道獲得latitud和TH縱向是異步的,但我不知道如何處理這種情況。

+0

目前,它看起來像你只是不發送,但我懷疑你已經簡化「dataToSend」對於這個問題的緣故 - 你可以解決這個問題吧。 – James

+0

@詹姆斯,很好,我現在正在編輯我的問題。 – lmiguelvargasf

+0

@詹姆斯,我添加了'dataToSend'的代碼片段 – lmiguelvargasf

回答

1

你是對的,這是一個Ajax /異步問題。所有使用getCurrentPosition結果的應該在該回調函數中,或者分成一個由回調調用的新函數。您可重複使用的功能可以在外面移動,以便它們在全球範圍內使用,以防需要再次使用它們。例如:

{% block js %} 
    <script> 
     function csrfSafeMethod(method) { 
     // these HTTP methods do not require CSRF protection 
     return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
     } 

     $.ajaxSetup({ 
     beforeSend: function(xhr, settings) { 
      if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
      xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}"); 
      } 
     } 
     }); 

     if ("geolocation" in navigator) { 
     navigator.geolocation.getCurrentPosition(
      function (position) { 
      console.log('Position has been set successfully'); 

      dataToSend = { 
       "fbpost": $("input[name=fb-post]").is(':checked'), 
       "latitude": position.coords.latitude, 
       "longitude": position.coords.longitude 
      }; 

      $.ajax({ 
       type: "POST", 
       dataType: 'json', 
       url: {% url 'pledges:home' %}, 
       data: JSON.stringify(dataToSend), 
       success: function (msg) { 
       console.log('Succeeded!');    
       }, 
       error: function (err) { 
       console.log('Error!'); 
       } 
      }); 
      }, function (error) { 
       console.log('Position could not be obtained.') 
      } 
     ); 
     } 
    </script> 
{% endblock %} 
+0

如果if(「geolocation」in navigator){}'在$(「#pledge-button」)內,該怎麼辦?click(function(e){ ...}',它會工作嗎? – lmiguelvargasf

+1

是的,應該沒問題。您可能想要將地理定位及其輔助ajax全部封裝在一個函數中,以便您可以輕鬆地將其應用於您的按鈕(但使用整個代碼體應該你也許應該將csrfSafeMethod函數和$ .ajaxSetup移到事件處理函數的外部,但它應該可以工作,無論如何。 – James

+0

非常感謝你的回答和你的時間,它像一個魅力 – lmiguelvargasf

相關問題