2017-04-05 12 views
1

誰かが私に戻ってくる理由を説明できますか?list index out of range、私の見解では2つ目の場所にあります。最初はcontext_data = self.get_context_data(user_id, month, year, form=form)context['month'] = calendar.month_name[month]にありますので、私のコードで何が起こっているか説明できます。リスト索引範囲外django

import calendar 
import datetime 

from django.contrib import messages 
from django.contrib.auth.models import User 
from django.core.urlresolvers import reverse 
from django.http import HttpResponseForbidden 
from django.shortcuts import redirect, get_object_or_404 
from django.views.generic.edit import FormView 

from .helpers.user_util import get_user_full_name_or_user_name 
from models import Rate 
from statistics.forms import CommissionsMonthSelectionForm 
from statistics.services import ManagerCommissionsProjectsCalculation, CommissionsAccessService 


class UserSalesCommissionsView(FormView): 
    template_name = "statistics/user_sales_commissions.html" 
    form_class = CommissionsMonthSelectionForm 
    currency = Rate.EUR 

    def get(self, request, *args, **kwargs): 
     user_id = self.kwargs['user_id'] 
     requesting_user = request.user 
     if CommissionsAccessService.can_view_commissions_page(requesting_user, user_id): 
      month = int(self.request.GET.get('month', datetime.datetime.now().month)) 
      year = int(self.request.GET.get('year', datetime.datetime.now().year)) 
      form = CommissionsMonthSelectionForm(initial={'year': year, 'month': month}) 
      context_data = self.get_context_data(user_id, month, year, form=form) 
      return self.render_to_response(context_data) 
     else: 
      return HttpResponseForbidden('Access denied') 

    def post(self, request, *args, **kwargs): 
     user_id = self.kwargs['user_id'] 
     requesting_user = self.request.user 

     if CommissionsAccessService.can_view_commissions_page(requesting_user, user_id): 
      form_class = self.get_form_class() 
      form = self.get_form(form_class) 
      if form.is_valid(): 
       return self.form_valid(form, user_id) 
      else: 
       return self.form_invalid(form) 
     else: 
      return HttpResponseForbidden('Access denied') 

    def form_valid(self, form, user_id=None): 
     year = form.cleaned_data['year'] 
     month = form.cleaned_data['month'] 
     return redirect(self.get_success_url(user_id, month, year)) 

    def form_invalid(self, form): 
     messages.add_message(self.request, messages.ERROR, 
          "Invalid data. Please check fields.") 
     return self.render_to_response(
      self.get_context_data(form=form) 
     ) 

    def get_success_url(self, 
         user_id=None, 
         year=datetime.datetime.now().year, 
         month=datetime.datetime.now().month): 
     return reverse("vinclucms_statistics:manager_commissions_statistics", user_id) + \ 
       "?month=" + str(month) + "&year=" + str(year) 

    def get_context_data(self, 
         user_id=None, 
         year=datetime.datetime.now().year, 
         month=datetime.datetime.now().month, 
         **kwargs): 
     context = super(UserSalesCommissionsView, self).get_context_data(**kwargs) 
     context['user_name'] = get_user_full_name_or_user_name(get_object_or_404(User, pk=user_id)) 
     context['can_view'] = True 
     context['currency'] = self.currency 
     context['month'] = calendar.month_name[month] 
     context['year'] = year 

     context['commissions'] = ManagerCommissionsProjectsCalculation.get_project_list(
      self.currency, year, month, user_id) 
     return context 

ビューのURL:

url(r'^statistics/commissions/sales/(?P<user_id>[^/]+?)/$', login_required(views.UserSalesCommissionsView.as_view()), name='user_sales_commissions') 

答えて

2

ここget_context_dataさんは定義です:

def get_context_data(self, 
        user_id=None, 
        year=datetime.datetime.now().year, 
        month=datetime.datetime.now().month, 
        **kwargs): 

そして、ここでは、それが呼ばれています方法は次のとおりです。

context_data = self.get_context_data(user_id, month, year, form=form) 

ので、2つのキーワード引数(yearmonth)は唾を吐くだろうcalendar.month_name[2017]のようなものに降伏逆になっていますIndexerror

あなたは正しい順序で引数を渡すか、キーワード引数を扱うとき、いつも自分の名前を指定する必要があります

context_data = self.get_context_data(user_id=user_id, month=month, year=year, form=form) 

とその順序は、任意のより重要ではないでしょうそのように。

PEP 3102もチェックしたいかもしれません。

+0

うん、私はそれをデバッグし、彼はそれらを逆転していることを知った、説明のおかげで – PetarP

1
month = datetime.datetime.now().month # IF Current month is April then month==4 

calendar.month_name[month] 

現在のロケールに年の数ヶ月を表す配列ここでフルTraceback

私の見解です。これは月の数字が1であるため、長さは13で、month_name [0]は空の文字列です。

ここに:calendar.month_name[month]monthの値を確認してください。現在の月は4月なので、4にする必要があります。

したがって、datetimeオブジェクトが必要な場所でStringを渡しています。

関連する問題