Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在表单提交时对地址进行地理编码?_Python_Django_Django Forms_Geocoding - Fatal编程技术网

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

Python 在表单提交时对地址进行地理编码?,python,django,django-forms,geocoding,Python,Django,Django Forms,Geocoding,试着用django的形式和django的做事方式来吸引我的注意力。我想创建一个基本的web表单,允许用户输入地址,并将该地址进行地理编码并保存到数据库中 我创建了一个位置模型: class Location(models.Model): address = models.CharField(max_length=200) city = models.CharField(max_length=100) state = models.CharField(max_length=

试着用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)
并定义了一种形式:

class LocationForm(forms.ModelForm):
    class Meta:
        model = models.Location
        exclude = ('latitude','longitude')
在我看来,我正在使用
form.save()
保存表单。这可以工作并将地址保存到数据库中


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

您可以覆盖模型的保存方法。我在保存之前对数据进行地理编码。这是使用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
-signal


请查看Django的信号文档。

我正在做类似的事情 可能是红豆杉,我们正在寻找类似的强大文本

# forms.py 
from django.contrib.gis.utils import GeoIP


class registerForm(forms.ModelForm): 
class Meta:
    model=register
    fields = ('Availability', 'Status')

def save(self,ip_address, *args, **kwargs):
    g = GeoIP()
    lat, lon = g.lat_lon(ip_address)
    user_location = super(registerForm, self).save(commit=False)
    user_location.latitude = lat
    user_location.longitude = lon
    user_location.save(*args, **kwargs)
以及我的看法

    #views.py
    if request.method == "POST":
 ip_address=request.META['REMOTE_ADDR']
    rform = registerForm(data = request.POST)
    if rform.is_valid():
  register = rform.save(commit=False)
  register.user=request.user
     register.save(ip_address)
        return render_to_response('home.html')
else:
    rform = registerForm() 
return render_to_response('status_set.html',{'rform':rform}) 

谷歌地图API v3的更新:

导入json
导入urllib.parse
从十进制输入十进制
def保存(自我):
如果不是self.lat或非self.lng:
self.lat,self.lng=self.geocode(self.address)
super(位置,自我).save()
def地理编码(自我,地址):
address=urllib.parse.quote\u plus(地址)
maps_api_url=“?”。加入([
"http://maps.googleapis.com/maps/api/geocode/json",
urllib.parse.urlencode({“地址”:地址,“传感器”:False})
])
response=urllib.urlopen(映射\ api \ url)
data=json.load(response.read().decode('utf8'))
如果数据['status']=='OK':
纬度=数据['results'][0]['geometry']['location']['lat']
lng=数据['results'][0]['geometry']['location']['lng']
返回小数(lat)、小数(lng)

与其他答案类似:

def geocode(address, city, state, zip_code):
    try:
        location_param = urllib.request.quote("%s, %s, %s, %s" % (address, city, state, zip_code))
        url_request = "http://maps.googleapis.com/maps/api/geocode/json?address=%s&sensor=false" % location_param
        result = requests.get(url_request)
        data = result.json()
        location = data['results'][0]['geometry']['location']
        lat = location['lat']
        lng = location['lng']
        return lat, lng
    except Exception:
        return None

非常感谢,我会尝试一下,然后再给你回复。您对geocode()返回元组或坐标对象而不是字符串有何看法?这是个好主意。在返回之前更好地打包数据会更干净。一般来说,我喜欢做这样的事情。我之所以这样做,是因为我如何重构了原始方程。我一直在想CSV就是这么回事,因为它是从谷歌回来的,但我喜欢你的想法。我将重构它以返回一个对象。下面是Google Maps API v3的更新。我得到一个无效的语法错误“return lat,lng”。我不知道为什么。