无法在模型中保存 GeoDjango 点

Cannot save GeoDjango Point in model

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

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

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

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

forms.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'}))

views.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>

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

完成request.user.useradvanced.localisation = Point(longitude, latitude)

后,您需要保存request.user.useradvanced

在你的函数中试试这个 views.py。

如果form.is_valid():

        post = form.save(commit=False)

        log = float(form.cleaned_data['longitude'])
        lat = float(form.cleaned_data['latitude'])

        # if you are using this srid = 4326
        pnt = Point(log,lat,srid = 4326)
        wkb_w = WKBWriter()
        geom_write = wkb_w.write_hex(pnt)

        post.geom = pnt
        post.save()