2012-07-08 60 views
0

我使用的Django開發Web應用程序。當我嘗試並在我的web表單上運行它時,我收到'字符串索引超出範圍'錯誤。但是,當我將一個字典硬編碼到一個python測試文件中時,它可以正常使用相同的值。字符串索引超出範圍的Python,Django的

這裏是我的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 
+1

哪裏回溯? – 2012-07-08 17:46:44

+1

@JoelCornett:「追溯或它沒有發生!」。我的感覺到底! – jdi 2012-07-08 17:54:47

+0

對不起,我添加了它。 – 2012-07-08 17:55:26

回答

1

的問題是在你使用的是QueryDict對象從request.GET的方式。 QueryDict是從請求的查詢字符串中初始化的。在GET請求中傳遞值列表的方式與baz=1&baz=2類似。當您直接通過鍵訪問該值時,就像它是一個正常的字典一樣,您只能獲得最後添加的值。

使用正確使用getlist的的QueryDict:

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

這將正確地返回值的列表。

另一種選擇是將其傳遞到您的其他方法之前的QueryDict簡單地轉換到正常的字典。這樣,將所有的正常展開值:

workout(dict(request.GET)) 

其實,這是因爲那時你的鍛鍊方法不會有有的QueryDict對象的專業知識一個很好的主意。它可以像正常的字典一樣對待它。除了特定的視圖相關情況之外,它可以被任何類似字典的數據結構使用。

+0

numsets \t = U'1' ,這意味着它應該是有效的不宜它 – 2012-07-08 18:01:33

+0

u'numsets ':[U'1',U'1' ],並且其通過JavaScript驗證。 exerciseisename和numsets的長度將始終相同。 – 2012-07-08 18:03:41

+0

嗯。那麼如果你在django視圖中驗證過它們的長度相同,那麼我將不得不繼續看看你的例子。你有沒有試過在頂部做一個檢查:'assert len(workout ['exercisename'])== len(workout ['numsets'])'? – jdi 2012-07-08 18:04:52

0

錯誤表示addworkout['numsets']實際上是一個長度小於i的字符串,因爲addworkout['numsets'][i]引發了異常。鑑於你的輸入字典有一個列表,我認爲內部有問題。你可以嘗試在函數調用中調試addworkout的內容,這樣你就可以確保它仍然包含你期望的內容。