-1

Django を使用して Web アプリケーションを開発しています。Web フォームで実行しようとすると、「string index out of range」エラーが発生します。ただし、辞書をPythonテストファイルにハードコードすると、同じ値で正常に機能します。

ここに私のDjangoビューがあります:

def submitworkout(request):
    #workoutinfo = workout(request.GET)
    return render_to_response('home.html',{'infoprompt': workout(request.GET)},context_instance=RequestContext(request))

オブジェクトは次のとおりです。

class workout():


    def __init__(self,addworkout):
        self.workout = collections.OrderedDict();
        getallreps = 0
        for i in range(len(addworkout['exercisename'])): 
            numsetcounter = 0; 
            self.workout[string.capwords(addworkout['exercisename'][i])] = [] 
            while numsetcounter < int(addworkout['numsets'][i]):   
                # print self.workout[addworkout['exercisename'][i]]
                self.workout[string.capwords(addworkout['exercisename'][i])].append([addworkout['weightinputboxes'][getallreps],addworkout['repinputboxes'][getallreps]]) 
                #[
                getallreps +=1
                numsetcounter +=1  

    def getexercise(self,name): 
        try: 
            return self.workout[string.capwords(name)];
        except:
            return 'This exercise does not exist!'

これは、クラスを実行しようとしている辞書です。

addworkout =    
 {u'repinputboxes': [u'5', u'3'], u'weightinputboxes': [u'195', u'170'], u'numsets': [u'1', u'1'], u'exercisename': [u'Squat', u'Power Clean']}

Djangoがエラーで表示しているローカル変数は次のとおりです。

i=1 

numsetcounter =0

getallreps = 1

皆さんが私の問題を解決するのを手伝ってくれることを願っています。前もって感謝します!

編集: トレースバック

Environment:


Request Method: GET
Request URL: http://localhost:8000/submitworkout/?exercisename=Squat&numsets=1&weightinputboxes=195&repinputboxes=5&exercisename=Power+Clean&numsets=1&weightinputboxes=170&repinputboxes=3

Django Version: 1.3.1
Python Version: 2.7.0
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'authentication')
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 "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Chris\testdjango\fitness\views.py" in submitworkout
  34.     return render_to_response('home.html',{'infoprompt': workout(request.GET)},context_instance=RequestContext(request))
File "C:\Users\Chris\testdjango\fitness\tracking\models.py" in __init__
  15.             while numsetcounter < int(addworkout['numsets'][i]):   # u'numsets': [u'1', u'2']

Exception Type: IndexError at /submitworkout/
Exception Value: string index out of range
4

2 に答える 2

1

問題は、 のQueryDictオブジェクトの使用方法にありますrequest.GET。QueryDict は、リクエストのクエリ文字列から初期化されます。値のリストが GET リクエストで渡される方法は のようなものbaz=1&baz=2です。通常の dict のようにキーで値に直接アクセスすると、最後に追加された値しか取得できません。

getlist を使用して QueryDict を適切に使用します

exercises = addworkout.getlist('exercisename')
numsets = addworkout.getlist('numsets')

これにより、値のリストが適切に返されます。

別のオプションは、QueryDict を他のメソッドに渡す前に、単純に通常の dict に変換することです。このようにして、すべての通常の展開された値が含まれます。

workout(dict(request.GET))

これは、ワークアウト メソッドが QueryDict オブジェクトの特別な知識を持っている必要がないため、実際には非常に良いアイデアです。通常の辞書のように扱うことができます。その後、特定のビュー関連の状況に加えて、辞書のようなデータ構造で使用できます。

于 2012-07-08T17:56:58.560 に答える
0

このエラーは、addworkout['numsets']が実際には長さが よりも小さい文字列であることを意味しiaddworkout['numsets'][i]例外が発生します。入力 dict にリストがある場合、内部で何か問題があると思います。関数呼び出し内の内容をデバッグして、addworkout期待どおりの正確な内容が含まれていることを確認できますか?

于 2012-07-08T18:11:55.607 に答える