【发布时间】:2018-03-07 14:45:24
【问题描述】:
我对 python 不太熟悉,从我的一个朋友那里得到了这段代码,需要一些社区帮助来解决这个问题。我从以下行收到“列表索引超出范围”错误。
days = list(zip(Leave_type.objects.filter(type=leavetype).values_list('max_days', flat=True))[0])
注意:我已经执行了迁移并设置了我的数据库。
def timeoffapply(request):
if not request.session.get('id', None):
return render(request, 'login.html')
else:
stdate = request.POST['startDate']
enddate = request.POST['endDate']
leavetype = request.POST['leaveType']
days = list(zip(Leave_type.objects.filter(type=leavetype).values_list('max_days', flat=True))[0])
d1 = datetime.strptime(stdate, "%Y-%m-%d")
d2 = datetime.strptime(enddate, "%Y-%m-%d")
d3 = abs((d2 - d1).days)+1
empid = (request.session['id'])[0]
countdays = Leave.objects.filter(Emp_id = empid,type=leavetype).aggregate(Sum('days'))
if countdays['days__sum'] == None:
finaday = (days[0] - 0)
else:
finaday=(days[0] - countdays['days__sum'])
if enddate>=stdate:
if finaday >= d3:
getleaveid = list(zip(Leave_type.objects.filter(type=leavetype).values_list('id', flat=True))[0])
split_lt_id = ("".join(str(e) for e in getleaveid))
empid = (request.session['id'])[0]
get_emp_name = list(zip(Employee.objects.filter(id=empid).values_list('name', flat=True))[0])
get_emp_name = ("".join(str(e) for e in get_emp_name))
empid = (request.session['id'])[0]
leave_id = Leave.objects.all().count()
test = Leave(id=(leave_id + 1), name=get_emp_name, type=leavetype, start_date=stdate, end_date=enddate,
days=d3,
status="pending")
test.Emp_id_id = empid
test.leave_type_id_id = split_lt_id
test.save()
return HttpResponseRedirect('/')
else:
qs = Leave.objects.all().filter(Emp_id=(request.session['id'])[0])
context = {
"qs": qs,
"error": "true",
"msg": "You are allowed to have holidays for " + str(finaday) + " days in " +str(leavetype)
}
return render(request, 'timeoff.html', context)
【问题讨论】:
-
打印作业右侧部分的组件,在作业之前,您应该找到错误原因。
-
您想更熟悉 Python 吗?可以通过多种方式改进此代码 (
finaday = (days[0] - 0)...),这将使您更容易理解错误。导致错误的那行也很奇怪(zip是不必要的,切片就可以了,但即使这样也是不必要的,因为days的唯一用途是days[0],所以你可以得到first结果)。无论如何,错误信息不会说谎;该列表必须为空,您可以按照 progmatico 的建议进行打印,以找出与您的预期不同的原因。
标签: python django python-2.7 django-models