Попытка перенести мою голову вокруг 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 и долго. Как я устанавливаю широту и долготу перед сохранением?
Можно переопределить метод сохранения модели. Я геокодировываю данные перед сохранением. Это с помощью 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 ','
Вы также можете использовать django.db.models.signals.pre_save
-сигнал!
Посмотрите документацию по сигналам Django по адресу http://docs.djangoproject.com/en/dev/topics/signals/ .