2012-07-08 9 views
0

웹 응용 프로그램을 개발하는 데 장고를 사용하고 있습니다. 내가 시도하고 내 웹 양식에서 '범위 밖의 문자열 인덱스'오류를 받고 오전 실행하십시오. 그러나, 내가 파이썬 테스트 파일에 사전을 하드 코드하면 같은 값으로 잘 작동합니다.문자열 인덱스가 범위를 벗어났습니다. Python, Django

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']} 
:

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!' 

지금이 내가 클래스를 통해 실행하는 데 노력하고있어 사전은 다음과 같습니다

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

는 객체입니다 여기에

내 장고보기입니다

이고 여기 장고가 오류에 표시하는 로컬 변수는 다음과 같습니다.

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

추적 대상은 어디입니까? –

+1

@JoelCornett : "자취가 생겼거나 그런 일이 없었습니다!". 정확히 내 감정이야! – jdi

+0

죄송합니다. 추가했습니다. –

답변

1

문제는 방법은 request.GET에서 QueryDict 객체를 사용입니다. QueryDict는 요청의 쿼리 문자열에서 초기화됩니다. GET 요청에서 값 목록이 전달되는 방식은 baz=1&baz=2입니다. 키에 의한 값에 직접 액세스 할 때 일반적인 dict 인 것처럼 추가 된 마지막 값만 가져옵니다.

제대로 getlist를 사용하여 QueryDict를 사용하여이 제대로 값 목록을 반환합니다

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

.

또 다른 옵션은 다른 방법으로 전달하기 전에 QueryDict를 일반 dict로 간단히 변환하는 것입니다. 이 모든 정상적인 확장 값을 가질 것이다이 방법은 :

workout(dict(request.GET)) 

이것은 실제로 다음 운동 방법은 QueryDict 객체의 특별한 지식이 필요하지 않기 때문에 정말 좋은 생각입니다. 보통의 dict처럼 취급 할 수 있습니다. 그런 다음 특정 뷰 관련 상황 외에도 사전과 같은 데이터 구조에서 사용할 수 있습니다.

+0

numsets \t = u'1 '이는 그것이 유효해야 함을 의미합니다. –

+0

u'numsets : [u'1', u'1 ']이며 자바 스크립트를 통해 유효성이 검사됩니다. exercisename과 numsets의 길이는 항상 동일합니다. –

+0

흠. 장고보기에서 둘 다 같은 길이라는 것을 확인했다면, 나는 당신의 예제를 계속 살펴 봐야 할 것입니다. 상단에서 다음과 같이 확인해 보았습니까 :'assert len ​​(운동 [ 'exercisename']) == len (운동 [ 'numsets'])'? – jdi

0

오류는 addworkout['numsets']이 실제로 길이가 i보다 작은 문자열임을 의미합니다. addworkout['numsets'][i]은 예외를 발생시킵니다. 귀하의 입력 dict 거기에 목록을 감안할 때, 나는 내부적으로 뭔가 잘못 있다고 가정합니다. 함수 호출 내에서 addworkout의 내용을 디버깅 해 볼 수 있으므로 예상 한 정확한 내용이 여전히 포함되어 있는지 확인할 수 있습니까?

관련 문제