【问题标题】:List Index Out of Range Error Has Me Beat列表索引超出范围错误让我失望
【发布时间】:2013-06-20 13:57:50
【问题描述】:

这两天让我好转。由于性能不佳,我需要限制我的 POST 数据的大小。当我运行它时,我得到了 IndexError 'list index out of range'。我有一组复杂的查询正在运行,它们捆绑在一起,结果被分配给“qs”。当调用表单集工厂以添加第二个表单时,它使用我的“事务”类对象;问题是,总的来说,这张桌子很大。然后我创建了表单并将其与页面中的 POST 数据一起使用。收集数据后,它似乎正在查询我的整个表。我附上了整个视图和有问题的表格。我很感激能得到任何帮助。

查看:

def update_pdate(request):

    STATES = ['Routed','Reconciled']

    formset = None

    form = StudyOnlyForm()

    study_pk = request.GET.get('study', '0')
    if study_pk == '' or study_pk == '0':
        study_pk = 0

    # child transactions that are 'Recoginzed',
    # reportable with a 'Routed' parent
    qs = Transaction.objects.filter(contract__reportable=True,
            cleared = False,
            contract__study__pk=study_pk,
            transaction_status='Recognized',
            parent_transaction__isnull=False,
            parent_transaction__transaction_status__in=STATES)

    #Designed to capture standalone contracts
    qs1 = Transaction.objects.filter(contract__reportable=True,
            cleared = False,
            contract__study__pk=study_pk,
            contract__contract_type__name='Standalone',
            transaction_status__in=STATES)

    #Captures Arms contracts for Milestone payments
    parent_list = []
    arms_list = []

    parent = Transaction.objects.filter(parent_transaction__isnull=True,
        contract__reportable=True,
        cleared = False,
        contract__study__pk=study_pk,
        contract__contract_type__name='ARMs',
        transaction_status__in=STATES)

    children = Transaction.objects.filter(contract__reportable=True,
            cleared = False,
            contract__study__pk=study_pk,
            transaction_status='Recognized',
            contract__contract_type__name='ARMs',
            parent_transaction__isnull=False,
            parent_transaction__transaction_status__in=STATES)

    for child_item in children:
        parent_list.append(child_item.parent_transaction.pk)
        arms_list.append(child_item.pk)

    for parent_item in parent:
        if parent_item.pk not in parent_list:
            arms_list.append(parent_item.pk)

    qs3 = Transaction.objects.filter(pk__in=arms_list)

    qs4 = qs | qs1 | qs3

    qs = qs4.order_by('-pk')

    formset = modelformset_factory(Transaction, form=PaidDateForm, extra=0, can_delete=False)

    if request.method == "POST":
        formset = formset(request.POST, queryset = qs)
        if formset.is_valid():
            updated_transactions = formset.save(commit=False)
            for trans in updated_transactions:
                if trans.paid_amount is not None and trans.date_cleared is not None:
                    trans_to_change = Transaction.objects.get(pk=trans.pk)
                    trans_to_change.paid_amount = trans.paid_amount
                    trans_to_change.date_cleared = trans.date_cleared
                    trans_to_change.paid_currency = trans_to_change.entered_currency
                    trans_to_change.paid_amount_usd = Decimal(str(trans_to_change.paid_amount * Decimal(str(trans_to_change.exchange_rate)).quantize(Decimal('0.01')))).quantize(Decimal('0.01'))
                    trans_to_change.edited_by = request.user
                    trans_to_change.cleared = True
                    trans_to_change.save()
            if updated_transactions:
                messages.add_message(request, messages.INFO, 'The transactions have been updated successfully.')
                return HttpResponseRedirect(reverse('track:update_pdate'))
            else:
                messages.add_message(request, messages.INFO, 'No transactions have been updated.')

                return render_to_response(
                    'track/paid_date_update.html',
                    {'formset':formset,
                     'form': form,
                     'study_pk':study_pk,
                    },
                    context_instance=template.RequestContext(request))

    else:
        formset = formset(queryset=qs)

    return render_to_response(
            'track/paid_date_update.html',
            {'formset':formset,
             'form': form,
             'study_pk':study_pk,
            },
            context_instance=template.RequestContext(request))

表格:

class PaidDateForm(forms.ModelForm):
    print 'PaidDateForm() begins'
    formfield_callback = jquery_datefield
    print 'end of jquery callback'
    #date_paid = forms.DateField(label="Paid Date", required=False)
    #paid_amount = forms.DecimalField(label="Cleared Amount",max_digits=14,decimal_places=2,required=False)
    date_cleared = forms.DateField(label="Cleared Date",widget=JQueryDateWidget(), input_formats=settings.DATE_INPUT_FORMATS, required=False)

    class Meta:
        model = Transaction
        include = ('date_time_created')

    def __init__(self, *args, **kwargs):
        self.queryset = Transaction.objects.filter(pk__in=qs)
        super(PaidDateForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            if field != 'date_cleared':
                #self.fields[field].queryset = qs
                self.fields[field].widget = forms.HiddenInput()
        #self.fields['paid_amount'].widget.attrs['size'] = 12
        #self.initial['paid_amount'] = '%.2f' % (self.instance.usd_amount)

【问题讨论】:

  • 你的qs返回一个空的查询集吗?
  • 我真的不确定“qs | qs1 | qs3”是否为您提供了一个有效的 Transaction 查询集。确实这个“|” is 是联合的按位运算符,所以我认为它返回查询集的所有功能,但不是有效的查询集。这可能会使 formset() 函数调用崩溃。尝试打印那个 qs 并检查它是一个查询集
  • 它返回一个有效的集合。这一直在运行,现在只是试图使其高效。目前试图弄清楚如何通过我的表单的第一个实例将布尔值传递给我的 PaidDateForm() 的 init where formset=formset(queryset=qs)

标签: python django forms indexing


【解决方案1】:

您应该启用调试模式并研究错误报告。它包含完整的异常信息和回溯以及故障发生时实际存在的大部分数据。我发现这些信息很有帮助。

【讨论】:

  • 错误在于具有“formset = formset(request.POST, queryset = qs)”的行。这就是表单被调用的地方。
  • 现在,它抱怨 qs 没有被全局定义,绑定到我视图底部的行:formset = formset(queryset=qs)
猜你喜欢
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多