【问题标题】:string index out of range Python, Django字符串索引超出范围 Python,Django
【发布时间】:2012-07-08 17:42:35
【问题描述】:

我正在使用 Django 开发 Web 应用程序。当我尝试在我的网络表单上运行它时,我收到“字符串索引超出范围”错误。但是,当我将字典硬编码到 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

【问题讨论】:

  • @JoelCornett:“追溯或者它没有发生!”。正是我的感受!

标签: python django


【解决方案1】:

问题在于您使用来自request.GETQueryDict 对象的方式。 QueryDict 从请求的查询字符串初始化。在 GET 请求中传递值列表的方式类似于 baz=1&amp;baz=2。当您像普通字典一样通过键直接访问该值时,您只会获得添加的最后一个值。

使用getlist正确使用QueryDict:

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

这将正确返回值列表。

另一种选择是简单地将 QueryDict 转换为普通字典,然后再将其传递给您的其他方法。这样它将具有所有正常的扩展值:

workout(dict(request.GET))

这实际上是一个非常好的主意,因为这样您的锻炼方法就不必具备 QueryDict 对象的特殊知识。它可以把它当作一个普通的字典来对待。除了特定的视图相关情况外,它还可以被任何类似字典的数据结构使用。

【讨论】:

  • numsets = u'1' 这意味着它应该是有效的,不是吗
  • u'numsets': [u'1', u'1'],通过javascript验证。 exercisename 和 numsets 的长度始终相同。
  • 嗯。好吧,如果您在 django 视图中验证了它们的长度相同,那么我将不得不继续查看您的示例。您是否尝试过在顶部进行检查,例如:assert len(workout['exercisename']) == len(workout['numsets'])
  • 呃,没有。虽然它们的长度相同,但当我在我的 Django 页面上显示它而不是创建锻炼对象时,只需查看如下所示的 querydict。 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']}
  • 你的第二个直觉是完全正确的。谢谢大佬!
【解决方案2】:

错误意味着addworkout['numsets']实际上是一个长度小于i的字符串,因为addworkout['numsets'][i]引发了异常。鉴于您的输入 dict 有一个列表,我认为内部有问题。您可以尝试在函数调用中调试addworkout 的内容,以确保它仍然包含您期望的确切内容吗?

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 2016-02-10
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    相关资源
    最近更新 更多