首页 > 解决方案 > 无法在模型中保存 GeoDjango 点

问题描述

我正在使用 Django 构建一个网站,并且在某些页面中,用户可以使用地理定位系统来保存其当前位置。一开始,页面显示一个以随机位置为中心的谷歌地图。然后用户点击一个按钮,它会找到他,并且它的当前位置会显示在地图上。字段latitudelongitude表单会自动填写。之后,用户可以提交表单,一个视图负责在数据库中保存一个Point对象和经纬度。问题是没有创建点:当我进入管理界面时,我们看到位置属性没有初始化,当我尝试在另一个视图中从点获取 and 时,我得到了latitude错误longitude'NoneType' object has no attribute 'y'这证明 Point 永远不会被创建。我不明白为什么,因为视图正确地获取了纬度和经度值(我在消息中显示它们以确保它们是正确的)。

这是我的代码的相关部分:models.py

from django.contrib.gis.db import models as models2

class UserAdvanced(models2.Model):
    localisation = models2.PointField(blank = True, null = True)

表格.py

class LocationForm(forms.Form):
    latitude = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))
    longitude = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control'}))

视图.py

from django.contrib.gis.geos import Point

def inscription_fin(request):
    if request.method == "POST":
        form = LocationForm(request.POST)
        if form.is_valid():
            longitude = float(form.cleaned_data['longitude']) #float(request.POST.get('longitude')) : I've tried this also but it doesn't work either.
            latitude = float(form.cleaned_data['latitude']) #float(request.POST.get('latitude'))
            request.user.useradvanced.localisation = Point(longitude, latitude)
            messages.success(request, "Latitude : " + str(latitude) + " / Longitude : " + str(longitude))
            return redirect("home")
    else:
        form = LocationForm()

    return render(request, 'inscription/inscription_fin.html', {'form': form})

html

<button id="find-me" class="btn btn-lg btn-outline-primary btn-login text-uppercase font-weight-bold mb-2">Localisez-moi maintenant</button><br/>
<div id="map" style="height: 100%"></div>
<p id = "status"></p>
<form method="post" action="" enctype="multipart/form-data">
  {% csrf_token %}
  <div class="fieldWrapper form-group"> Latitude : <input type="text" name="latitude" value="" id="latitude" required="required"/></div>
  <div class="fieldWrapper form-group"> Longitude : <input type="text" name="longitude" value="" id="longitude" required="required"/></div>
  <input type="submit" class="btn btn-lg btn-outline-primary btn-block btn-login text-uppercase font-weight-bold mb-2" value="Soumettre ma localisation" />
</form>

javascript

<script src="https://maps.googleapis.com/maps/api/js?key=MY_KEY&callback=initMap" async defer></script>
<script>
  function initMap() {
    lln = {lat: 50.66981991272638, lng: 4.615554319641566}
    var map = new google.maps.Map(document.getElementById('map'), {center: lln, zoom: 15});
    var marker = new google.maps.Marker({position: lln, map: map});
  }

  function geoFindMe() {
    const status = document.querySelector('#status');
    var map;

    function success(position) {
      const latitude  = position.coords.latitude;
      const longitude = position.coords.longitude;

      status.textContent = '';
      document.getElementById('longitude').value = longitude;
      document.getElementById('latitude').value = latitude;
      loc = {lat: latitude, lng: longitude}
      map = new google.maps.Map(document.getElementById('map'), {center: loc, zoom: 17});
      var marker = new google.maps.Marker({position: loc, map: map});
   }

   function error() {
     status.textContent = 'Nous ne parvenons pas à obtenir votre localisation. Veuillez réessayer plus tard.';
   }

   if (!navigator.geolocation) {
     status.textContent = 'La géolocalisation n\'est pas supportée par votre navigateur';
   }
   else {
     status.textContent = 'Localisation…';
     navigator.geolocation.getCurrentPosition(success, error);
   }
 }

 document.querySelector('#find-me').addEventListener('click', geoFindMe);
</script>

我知道错误可能是虚拟的,但我搜索了很多,但我自己找不到解决方案。我提前感谢您的回复!

标签: djangodjango-modelsdjango-formsgeodjango

解决方案


request.user.useradvanced完成后需要保存request.user.useradvanced.localisation = Point(longitude, latitude)


推荐阅读