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
相关产品推荐
相关产品推荐

