【问题标题】:Problem with sending client side data to server side (django)将客户端数据发送到服务器端(django)的问题
【发布时间】:2019-05-19 12:19:20
【问题描述】:

我正在尝试将客户端数据(用于纬度和经度的 html5 api)发送到服务器端。我对JS不熟悉,但是我找到了纬度和经度的两个JS函数的代码:

function latitude() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            return document.getElementById('latitude').setAttribute("value", position.coords.latitude);
        }
        );
    }
    else {
        alert("Sorry, your browser does not support HTML5 geolocation.");
    }
}
function longitude() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            return document.getElementById('longitude').setAttribute("value", position.coords.longitude);
        }
        );
    }
    else {
        alert("Sorry, your browser does not support HTML5 geolocation.");
    }
}

然后我创建了将接收数据的 django 表单:


class CordsForm(forms.Form):
    latitude = forms.CharField(widget=forms.TextInput(
        attrs={'id': 'latitude', 'type': 'hidden'}))
    longitude = forms.CharField(widget=forms.TextInput(
        attrs={'id': 'longitude', 'type': 'hidden'}))

我还创建了使用表单的视图:

def index(request):
    if request.method == 'POST':
        cords_form = CordsForm(request.POST)
        if cords_form.is_valid():
            latitude = cords_form.cleaned_data['latitude']
            longitude = cords_form.cleaned_data['longitude']
            print(longitude) # only for testing
            print(latitude) # only for testing
    else:
        cords_form = CordsForm()
    return render(request, 'weather/index.html', {'form': cords_form})

这是索引页面:

{% extends 'weather/base.html' %}
{% block content %}
<form method="POST" id="geoform" name="geoform">
    {% csrf_token %}
    {{ form.latitude }}
    <script>latitude();</script>
    {{ form.longitude }}
    <script>longitude();</script>
</form>
<script>
    document.addEventListener("DOMContentLoaded", function (event) {
        document.getElementById("geoform").submit();
    });
</script>
{% endblock content %}

每次用户访问索引页面,都会通过表单自动发送经纬度,但是这段代码:

<script>
    document.addEventListener("DOMContentLoaded", function (event) {
        document.getElementById("geoform").submit();
    });
</script>

发送数据,但它正在刷新页面,就像我正在向 F5 按钮发送垃圾邮件一样。如何在访问索引页面时只发送一次数据?

【问题讨论】:

  • 你应该使用 ajax 来完成这个任务

标签: javascript python jquery ajax django


【解决方案1】:

你应该在本地存储:

当你想向服务器发送数据时,检查一下,如果你没有那个功能可以发送那个

你应该在 if 语句中使用这个代码来检查你的本地存储而不是运行这个:

document.addEventListener("DOMContentLoaded", function (event) {
        document.getElementById("geoform").submit();

像这样:

var check = localStorage.getItem('posted');
if(check !== 'true'){
document.addEventListener("DOMContentLoaded", function (event) {
        document.getElementById("geoform").submit();
localStorage.setItem('posted','true')
}

https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

【讨论】:

  • 但解决这个问题的更好方法是 ajax
  • 你能告诉我关于ajax,搜索什么等,因为我不知道js和ajax我只熟悉python和django,html,css
  • 这对你有帮助 w3schools.com/js/js_ajax_intro.asp ,但我的问题应该有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2012-08-29
相关资源
最近更新 更多