在Django表单中放置GeoIP IP/lat\lon信息

2024-06-16 14:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在开发一个应用程序,我想在其中自动将经纬度坐标插入到用户表单中。我在这里找到了一篇文章,它的目标几乎完全是我试图完成的geocoding an IP and save using model forms,但我似乎在这个过程中犯了一个错误。我安装了GeoIP来跟踪用户的IP和lat,lon。在

以下是视图代码:

@login_required
def submit_story(request):
if request.method =="POST":
    story_form = StoryForm(request.POST, request.FILES)
    if story_form.is_valid():
        new_story = story_form.save(ip_address=request.META['REMOTE_ADDR'])
        new_story.author = request.user
        new_story.save()
        return HttpResponseRedirect("/report/all/")
else: # GET request
    story_form = StoryForm()
return render_to_response("report/report.html", {'form': story_form}, context_instance=RequestContext(request))

这就是我认为问题所在的形式:

^{pr2}$

这是回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/report/report/

Django Version: 1.3.1
Python Version: 2.7.1
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'registration',
 'profiles',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'stentorian.report',
 'south',
 'sorl.thumbnail',
 'gmapi',
 'django.contrib.admin']
Installed Middleware:
 ('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
     File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-        packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
 File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
   23.                 return view_func(request, *args, **kwargs)
 File "/Users/myname/Development/stentorian/../stentorian/report/views.py" in submit_story
  30.             new_story = story_form.save(ip_address=request.META['REMOTE_ADDR'])
 File "/Users/myname/Development/stentorian/../stentorian/report/forms.py" in save
  16.         lat, lon = g.lat_lon(ip_address)

Exception Type: TypeError at /report/report/
Exception Value: 'NoneType' object is not iterable

这是我第一次涉足地理定位,也是第一个Django项目,所以我确信错误很简单(也许我需要拆分元组,不确定)。在


Tags: djangoinpyreportformnewrequestsave
2条回答

这个

lat, lon = g.lat_lon(ip_address)

是导致异常的原因,因为g.lat_lon()返回None,因此它的结果 无法解压为latlon。在

{like}例如,{cd3}应该返回。在

这意味着您正在向g.lat_lon()传递一个无效参数,或者 因为其他原因它不能解决纬度/经度。在

更新:

^{pr2}$

我想你是在本地工作站上运行的,在这种情况下 request.META['REMOTE_ADDR']的值是"127.0.0.1",显然 不是g.lat_lon()能解决的问题。在

开发时设置.调试==正确。所以你可以做下面的事

from django.conf import settings

def submit_story(request):
    remote_addr = request.META['REMOTE_ADDR']
    if settings.DEBUG:
        # We are in debug mode, so we set it to a dummy value.
        remote_addr = 'google.com'

    if request.method =="POST":
        story_form = StoryForm(request.POST, request.FILES)
        if story_form.is_valid():
            new_story = story_form.save(ip_address=remote_addr)

嗯。。。只是为了确定。。。你粘贴的代码中没有明显的缩进错误吗? 你的错误到底说明了什么?在

编辑:我认为您的错误可能在于您是按名称传递ip地址,而您将其定义为save()方法的位置参数。这看起来也发生在你联系的另一个答案里,顺便说一句。。。:)

尝试更改代码中的以下行:

def save(self, ip_address, *args, **kwargs)

通过这个:

def save(self, ip_address=None, *args, **kwargs)

相关问题 更多 >