Геокодирование адреса на представлении формы?

Попытка перенести мою голову вокруг django формируется и django способ сделать вещи. Я хочу создать основную веб-форму, которая позволяет пользователю вводить адрес и геокодировать тот адрес и сохраненный к базе данных.

Я создал модель Location:

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 способ сделать вещи, но я предполагаю, по моему мнению, прежде чем я сохраню форму, я должен геокодировать адрес и установить lat и долго. Как я устанавливаю широту и долготу перед сохранением?

8
задан juliomalegria 31 January 2012 в 18:44
поделиться

2 ответа

Можно переопределить метод сохранения модели. Я геокодировываю данные перед сохранением. Это с помощью 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 ','
8
ответ дан 5 December 2019 в 12:56
поделиться

Вы также можете использовать django.db.models.signals.pre_save -сигнал!

Посмотрите документацию по сигналам Django по адресу http://docs.djangoproject.com/en/dev/topics/signals/ .

2
ответ дан 5 December 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: