【问题标题】:geocoding an IP and save using model forms对 IP 进行地理编码并使用模型形式保存
【发布时间】:2010-11-26 00:25:39
【问题描述】:

我的 models.py 文件中有这个东西

        user = models.ForeignKey('auth.User', unique = True) 
        latitude = models.DecimalField(max_digits=8, decimal_places=6)
        longitude = models.DecimalField(max_digits=8, decimal_places=6)
        Availability  = models.CharField(max_length=8,choices=STATUS_CHOICES, blank= False, null=False)
        Status = models.CharField(max_length=50, blank = True, null= True)

在forms.py中我有

class registerForm(forms.ModelForm):

      class Meta:
        model=register
          fields = ('latitude', 'longitude', 'Availability', 'Status')

现在我想要的是对用户的 IP 地址进行地理编码,并在对 IP 进行地理编码后自动获取纬度和经度并将其保存到数据库中。我不想让用户手动输入纬度和经度,因为这会很奇怪,而且肯定没有人愿意手动输入。 我正在使用 GeoIP 对 IP 地址进行地理编码。在我的views.py中我有

def Userlocation(request):
    if request.method == "POST":
        rform = registerForm(data = request.POST)
        if rform.is_valid():
            register = rform.save(commit=False)
            register.user=request.user
            register.save()
            return render_to_response('home.html')
    else:
        rform = registerForm() 
    return render_to_response('status_set.html',{'rform':rform}) 

我正在寻找一种从 GeoIP 自动获取纬度、经度并将其放置在表单中的纬度经度字段中的方法,这样用户就不必手动输入它。然后在输入状态和可用性后,表格可以保存到数据库中。 任何帮助将不胜感激

【问题讨论】:

    标签: django django-forms geocoding geoip


    【解决方案1】:

    覆盖表单的save方法填充经纬度

    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 = `get the lat & lng`
            user_location = super(registerForm, self).save(commit=False)
            user_location.latitude = lat
            user_location.longitude = lon
            user_location.save(*args, **kwargs)
    

    【讨论】:

    • 我已经覆盖了 save 方法,但是 django 咆哮为“save() 至少需要 2 个非关键字参数(1 个给定)”
    • 你现在可能已经让它工作了,如果不是在视图中调用 save 方法时将请求中的 ip_address 作为参数传递。
    【解决方案2】:

    改变这一行

    register = rform.save(commit=False)
    

    register = rform.save(ip_address=request.META['REMOTE_ADDR'])
    

    【讨论】:

      猜你喜欢
      • 2011-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多