Не удается сохранить Geo Django Point в модели - PullRequest
0 голосов
/ 24 января 2020

Я создаю веб-сайт с Django, и на некоторых страницах пользователь может использовать систему геолокации для сохранения своего текущего местоположения. В начале страницы отображаются карты Google с центром в случайном месте. Затем пользователь нажимает на кнопку, он находит его, и его текущее местоположение отображается на карте. Поля latitude и longitude формы заполняются автоматически. После этого пользователь может отправить форму, а представление отвечает за сохранение объекта Point в базе данных с широтой и долготой. Проблема в том, что Точка не создается: когда я go к интерфейсу администратора, мы видим, что атрибут location не инициализируется, и когда я пытаюсь получить latitude и longitude из Точки в другом виде, Я получаю ошибку '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>

Я знаю, что ошибка, вероятно, фиктивная, но я много искал и не могу найти решение самостоятельно. Заранее благодарю за ответ!

Ответы [ 2 ]

1 голос
/ 25 января 2020

Попробуйте это в своей функции 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()
1 голос
/ 24 января 2020

Вам нужно сохранить request.user.useradvanced после того, как вы request.user.useradvanced.localisation = Point(longitude, latitude)

...