как предоставить значение поля точки по умолчанию для местоположения пользователя с помощью API геолокации, не удалось преобразовать строку в float: - PullRequest
1 голос
/ 06 мая 2020

Я новичок в geodjango Я хочу создать реальный gis проект с geodjango, чтобы найти locations Я пробовал это

class Place(models.Model):
    user= models.ForeignKey(Account,on_delete=models.CASCADE)
    address = models.CharField(max_length=100)
    slug = models.SlugField(unique=True,blank=True,null=True)
    description = models.TextField()
    location = models.PointField(srid=4326)

views.py

class PalceCreateView(CreateView):
    queryset = Place.objects.all()
    def form_valid(self,form):
       lat = self.request.POST['lat']
       lon = self.request.POST['long']
       coords = Point(lat,lon)
       form.instance.location = coords
       form.save()
       return super(PalceCreateView,self).form_valid(form)

my forms.py

class PlaceForm(forms.ModelForm):
    class Meta:
       model = Place
       fields = [
          'name','description','location','city','tags'
       ]
       read_only_fields = ['location']

мой шаблон

 <form enctype="multipart/form-data" method="post">
        {% csrf_token %}
        <input type="hidden" name="lat" id="lat">
        <input type="hidden" name="long" id="long">

        {{form}}
        <input type='submit' value='submit'>      
</form>
<script>
  navigator.geolocation.getCurrentPosition(function(location) {
    lat = location.coords.latitude;
    long = location.coords.longitude;
    document.getElementById('lat').innerHTML= lat
    document.getElementById('long').innerHTML = long
});
</script>

, но когда я отправляю форму, она вызывает эту ошибку

Недействительно параметры, указанные для инициализации точки.

Как я могу назначить ее полю местоположения?

Ответы [ 2 ]

0 голосов
/ 12 мая 2020

Вы хотите запретить пользователю изменять начальную точку и хотите добавить второе поле для ввода потенциальной точки.

Вы можете добиться этого, добавив дополнительный form.PointField непосредственно в определение формы:

from django.contrib.gis import forms

class PlaceForm(forms.ModelForm):
    new_location = forms.PointField()

    class Meta:
       model = Place
       fields = [
          'name','description','location','city','tags', 'new_location'
       ]
       read_only_fields = ['location']

, а затем в вашем представлении:

class PalceCreateView(CreateView):
    queryset = Place.objects.all()
    def form_valid(self,form):
       new_location = self.request.POST['new_location']
       form.instance.location = new_location
       form.save()
       return super(PalceCreateView,self).form_valid(form)

Или вы можете изменить существующее решение (lat, long как пару form.FloatField] 2 s) следующим образом:

class PlaceForm(forms.ModelForm):
    lat = forms.FloatField()
    long = forms.FloatField()

    class Meta:
       model = Place
       fields = [
          'name','description','location','city','tags', 'lat', 'long'
       ]
       read_only_fields = ['location']

, и ваше представление останется то же

0 голосов
/ 06 мая 2020

исправлено просто изменением скоординированного типа на float

def form_valid(self,form):
    lat = float(self.request.POST.get('lon'))
    lon = float(self.request.POST.get('lat'))
...