javascript - 如何使用 AJAX 将经纬度发送到 Django 服务器

标签 javascript ajax django location

我正在使用 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 %}

但是,当我尝试在我的 View 中获取 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)

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

最佳答案

你是对的,这是一个 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 %}

关于javascript - 如何使用 AJAX 将经纬度发送到 Django 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44169448/

相关文章:

javascript - 如果选中输入,则将类添加到 HTML 元素

javascript - 检查一个时取消选中其他单选按钮,有问题

javascript - 同步发出多个ajax请求

ajax - JSF(Primefaces)通过ID对多个元素进行Ajax更新

python - 尝试在 Django 中遍历 session 字典时出现 KeyError 0

python - django-taggit:使标签在管理员中不需要

javascript - 在 React Native 中通过 fetch 设置状态

javascript - 在javascript中删除文本文本的某些部分

javascript - 因为我使用的是 Ajax 功能,所以在按回车时禁用表单提交

python - 在django中自动为新Teanants创建新用户