试图让我的大脑围绕django表单和django的做事方式。我想创建一个基本的网页表单,允许用户输入一个地址,并将该地址地理编码并保存到数据库中。
我创建了一个位置模型:
class Location(models.Model):
address = models.CharField(max_length=200)
city = models.CharField(max_length=100)
state = models.CharField(max_length=100, null=True)
postal_code = models.CharField(max_length=100, null=True)
country = models.CharField(max_length=100)
latitude = models.DecimalField(max_digits=18, decimal_places=10, null=True)
longitude = models.DecimalField(max_digits=18, decimal_places=10, null=True)
并定义了一个表单:
class LocationForm(forms.ModelForm):
class Meta:
model = models.Location
exclude = ('latitude','longitude')
在我的视图中,我使用form.save()
来保存表单。这是可行的,并将地址保存到数据库。
我创建了一个模块来对地址进行地理编码。我不确定django做事情的方式是什么,但在我看来,在保存表单之前,我需要对地址进行地理编码,并设置经度和经度。保存前如何设置经纬度?
发布于 2010-05-02 21:25:31
您可以覆盖模型的save方法。我在保存之前对数据进行了地理编码。这是使用googleapi,但可以相应地进行修改。
import urllib
def save(self):
location = "%s, %s, %s, %s" % (self.address, self.city, self.state, self.zip)
if not self.latitude or not self.longitude:
latlng = self.geocode(location)
latlng = latlng.split(',')
self.latitude = latlng[0]
self.longitude = latlng[1]
super(Marker, self).save()
def geocode(self, location):
output = "csv"
location = urllib.quote_plus(location)
request = "http://maps.google.com/maps/geo?q=%s&output=%s&key=%s" % (location, output, settings.GOOGLE_API_KEY)
data = urllib.urlopen(request).read()
dlist = data.split(',')
if dlist[0] == '200':
return "%s,%s" % (dlist[2], dlist[3])
else:
return ','
发布于 2013-11-14 03:07:57
谷歌地图应用编程接口v3的更新:
import json
import urllib.parse
from decimal import Decimal
def save(self):
if not self.lat or not self.lng:
self.lat, self.lng = self.geocode(self.address)
super(Location, self).save()
def geocode(self, address):
address = urllib.parse.quote_plus(address)
maps_api_url = "?".join([
"http://maps.googleapis.com/maps/api/geocode/json",
urllib.parse.urlencode({"address": address, "sensor": False})
])
response = urllib.urlopen(maps_api_url)
data = json.loads(response.read().decode('utf8'))
if data['status'] == 'OK':
lat = data['results'][0]['geometry']['location']['lat']
lng = data['results'][0]['geometry']['location']['lng']
return Decimal(lat), Decimal(lng)
发布于 2010-05-02 21:38:23
您也可以使用django.db.models.signals.pre_save
-signal!
可以在http://docs.djangoproject.com/en/dev/topics/signals/上查看Django的信号文档。
https://stackoverflow.com/questions/2755027
复制