You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dango:列表尚有元素但循环10次后触发list index out of range错误

问题分析

你遇到的索引越界错误,核心原因是第10条卡牌名称在数据库中找不到匹配结果:代码里直接通过ccards[0]访问查询结果,但如果Card.where(name=f'"{ccards_name}"').all()返回空列表,就会触发索引越界异常。

前9条能正常处理,说明它们的卡牌名称都能在数据库中找到对应记录;第10条要么是名称格式处理后有误,要么数据库里确实没有这条卡牌的数据。此外代码还有几个逻辑漏洞:

  • 查询条件多了多余的双引号,导致匹配失败概率升高
  • 换行符分割只兼容Windows格式,其他系统的换行会处理出错
  • GET请求访问页面时也会创建空卡组,逻辑错误
  • 未处理查询结果为空的边界情况
修复方案

1. 修正查询条件的引号问题

把Card.where(name=f'"{ccards_name}"').all()改成Card.where(name=ccards_name).all(),去掉多余的双引号——数据库里的卡牌名称本身不会带引号,加引号会导致匹配失败。

2. 增加空结果判断

在访问查询结果前先检查是否为空,避免索引越界:

if not ccards:
    print(f"未找到卡牌:{ccards_name},跳过处理")
    continue

3. 兼容所有换行格式

用splitlines()替代split("\r\n"),自动识别Windows、Linux/macOS的换行符。

4. 调整卡组创建逻辑

只在POST请求时创建卡组,避免GET请求误创建空卡组。

修复后的完整代码

import re
from django.http import HttpResponse
from django.shortcuts import render

def new_deck(request):
    form = mtgForm()
    if request.method == "POST":
        current_user = request.user
        # 仅在POST请求时创建卡组
        add_deck = Decks(deck_name=request.POST['Deck_Name'], user_id=current_user.id)
        add_deck.save()
        decks_id = add_deck.deck_id
        
        cards_from = request.POST['cards']
        # 兼容所有换行格式
        cards_from_form = cards_from.splitlines()
        # 过滤空行并去除首尾空格
        cards_from_form = [x.strip() for x in cards_from_form if x.strip()]
        
        for i, dataa in enumerate(cards_from_form):
            # 提取卡牌数量
            amount_of_cards = ''.join(x for x in dataa if x.isdigit())   
            # 提取卡牌名称(去除数字和左侧空格)
            ccards_name = re.sub(r'[0-9]', '', dataa).lstrip()
            
            # 修正查询条件,去掉多余引号
            ccards = Card.where(name=ccards_name).all()
            
            # 处理查询结果为空的情况
            if not ccards:
                print(f"跳过未找到的卡牌:{ccards_name}")
                continue
            
            ccard = ccards[0]
            add_cards = cards(
                card_name=ccard.name,
                card_type=ccard.type,
                card_cost=ccard.mana_cost,
                card_toughness=ccard.toughness,
                card_power=ccard.power,
                card_rarity=ccard.rarity,
                card_set=ccard.set,
                card_color_idenity=ccard.color_identity,
                deck_id=decks_id
            )
            add_cards.save()
        
        return HttpResponse("卡牌已添加到卡组")
    else:
        # GET请求仅渲染表单
        return render(request, "form.html", {"form": form})

额外优化建议

  • 用Django表单的clean方法验证输入的卡牌格式,提前过滤无效数据
  • 卡牌数量多的时候用bulk_create替代循环save,提升性能
  • 收集未找到的卡牌名称,在响应中提示用户哪些卡牌未添加成功

内容的提问来源于stack exchange,提问作者HelloMrGoat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 13:35:38