如何使用地理位置API为用户提供默认的点域值,无法将字符串转换为浮点。

问题描述 投票:0回答:1

我是新手 geodjango 我想做真实世界的 gis 项目与 geodjangolocations 我试了一下

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)

视图.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)

我的表格.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>

但当我提交表格时,它就会出现这个错误。

给予点初始化的参数无效。

我怎么能把它分配到一个位置字段?

django geolocation geodjango
1个回答
0
投票

只需使用改变协调的浮动类型就可以解决了。

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

0
投票

您想防止用户修改初始点,并想为潜在的点输入添加第二个字段。

您可以通过添加一个额外的 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的)如下。

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']

而你的观点仍然不变。

© www.soinside.com 2019 - 2024. All rights reserved.