在表单提交上对地址进行地理编码?

Use*_*ser 8 python django geocoding django-forms

试图围绕django形式和django做事方式.我想创建一个基本的Web表单,允许用户输入地址并将该地址进行地理编码并保存到数据库中.

我创建了一个位置模型:

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)
Run Code Online (Sandbox Code Playgroud)

并定义了一个表单:

class LocationForm(forms.ModelForm):
    class Meta:
        model = models.Location
        exclude = ('latitude','longitude')
Run Code Online (Sandbox Code Playgroud)

在我看来,我正在使用form.save()保存表单.这可以工作并将地址保存到数据库中.

我创建了一个模块来对地址进行地理编码.我不确定django的做法是什么,但我想在我看来,在保存表单之前,我需要对地址进行地理编码并设置lat和long.保存前如何设置纬度和经度?

dig*_*mer 8

您可以覆盖模型的保存方法.我在保存之前对数据进行了地理编码.这是使用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 ','
Run Code Online (Sandbox Code Playgroud)