我是新手 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)
视图.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>
但当我提交表格时,它就会出现这个错误。
给予点初始化的参数无效。
我怎么能把它分配到一个位置字段?
只需使用改变协调的浮动类型就可以解决了。
def form_valid(self,form):
lat = float(self.request.POST.get('lon'))
lon = float(self.request.POST.get('lat'))
您想防止用户修改初始点,并想为潜在的点输入添加第二个字段。
您可以通过添加一个额外的 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']
而你的观点仍然不变。