无法在模型中保存 GeoDjango 点
Cannot save GeoDjango Point in model
我正在使用 Django 构建一个网站,在某些页面中,用户可以使用地理定位系统来保存其当前位置。开始时,页面显示以随机位置为中心的 google 地图。然后用户点击一个按钮,它定位他并且它的当前位置显示在地图上。表单的字段 latitude
和 longitude
会自动填写。之后,用户可以提交表单,视图负责将带有纬度和经度的 Point 对象保存到数据库中。问题是没有创建点:当我进入管理界面时,我们看到位置属性没有初始化,当我尝试从另一个点中获取 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>
我知道这个错误可能是假的,但我已经搜索了很多,但我自己找不到解决方案。提前感谢您的回复!
完成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()
我正在使用 Django 构建一个网站,在某些页面中,用户可以使用地理定位系统来保存其当前位置。开始时,页面显示以随机位置为中心的 google 地图。然后用户点击一个按钮,它定位他并且它的当前位置显示在地图上。表单的字段 latitude
和 longitude
会自动填写。之后,用户可以提交表单,视图负责将带有纬度和经度的 Point 对象保存到数据库中。问题是没有创建点:当我进入管理界面时,我们看到位置属性没有初始化,当我尝试从另一个点中获取 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>
我知道这个错误可能是假的,但我已经搜索了很多,但我自己找不到解决方案。提前感谢您的回复!
完成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()