0

私は現在、緯度と経度の座標をユーザーフォームに自動的に挿入したいアプリケーションに取り組んでいます。IP のジオコーディングを達成し、モデル フォームを使用して保存しようとしているのとほぼ同じことを行うことを目的とした以前の投稿をここで見つけましたが、プロセスでエラーが発生しているようです。ユーザーの IP と緯度、経度を追跡するために GeoIP をインストールしました。

ビューコードは次のとおりです。

@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))

そして、これは問題があると私が信じているフォームです:

class StoryForm(forms.ModelForm):
    class Meta:
        model = Story
        exclude = ('author','latitude', 'longitude')

    def save(self, ip_address, *args, **kwargs):
        g = GeoIP()
        lat, lon = g.lat_lon(ip_address)
        user_location = super(StoryForm, self).save(commit=False)
        user_location.latitude = lat
        user_location.longitude = lon
        user_location.save(*args, **kwargs)

これはトレースバックです:

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 プロジェクトに足を踏み入れたのはこれが初めてなので、間違いは単純だと確信しています (おそらく、タプルを分割する必要があるかもしれませんが、よくわかりません)。

4

2 に答える 2

0

これ

lat, lon = g.lat_lon(ip_address)

g.lat_lon()がNoneを返しているため、例外が発生しています。そのため、結果をとに解凍できませlatlon

(32.0434235, 43.532522)たとえば、次のようなものを返す必要があります。

これは、に無効な引数を渡しているか、g.lat_lon()他の理由でlat/lonを解決できないことを意味します。

アップデート:

new_story = story_form.save(ip_address=request.META['REMOTE_ADDR'])

これをローカルワークステーションから実行していると思います。その場合、 は明らかに解決できるrequest.META['REMOTE_ADDR']"127.0.0.1"ではない値を持っています。g.lat_lon()

開発中の場合、settings.DEBUG==True。だからあなたは次のことをすることができます

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)
于 2012-05-25T23:56:02.687 に答える
0

うーん...念のため...貼り付けたコードに明らかなインデント エラーはありませんか? あなたのエラーは正確に何を言っていますか?

編集:あなたのエラーは、名前で ip_address を渡しているという事実にある可能性があると思いますが、フォームsave()メソッドで位置引数として定義しています。ちなみに、リンクした他の回答でも起こっていたようです... :)

コードで次の行を変更してみてください。

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

これによって:

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

于 2012-05-25T23:05:24.390 に答える