【问题标题】:How to send latitude and longitude to django server using AJAX如何使用 AJAX 向 django 服务器发送纬度和经度
【发布时间】:2017-05-24 22:25:51
【问题描述】:

我正在使用 django,每次点击元素时都需要使用 AJAX 发送纬度和经度。

这是我的模板中的内容:

{% 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 %}

但是,当我尝试获取我认为纬度的值时,我收到了一个错误,因为它没有发送:

KeyError: '纬度'

这是我认为的代码:

@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)

我怎样才能做到这一点,我知道获取纬度和经度是异步的,但我不知道如何处理这种情况。

【问题讨论】:

  • 目前看起来你只是没有发送它,但我怀疑你为了这个问题简化了“dataToSend” - 你能解决这个问题吗?
  • @James,很好,我现在正在编辑我的问题。
  • @James,我添加了dataToSend的代码

标签: javascript ajax django location


【解决方案1】:

你是对的,这是一个 ajax/async 问题。使用 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 %}

【讨论】:

  • 如果if ("geolocation" in navigator) {}$("#pledge-button").click(function(e) {...} 里面,它会起作用吗?
  • 是的,应该没问题。您可能希望将 geolocate 及其辅助 ajax 全部包装在一个函数中,以便您可以轻松地将其应用到您的按钮(但使用整个代码体也应该可以工作)。您可能应该将 csrfSafeMethod 函数和 $.ajaxSetup 移到事件处理程序之外,但无论如何它都应该工作。
  • 非常感谢您的回答和您的时间,它就像一个魅力
猜你喜欢
  • 2017-08-25
  • 2016-09-08
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多