Django项目点击view按钮报MultiValueDictKeyError 'bid'错误求助
问题根因
- 点击View按钮访问页面是GET请求,你的
viewList视图没有区分GET/POST请求,if not listing.activate:分支下的逻辑会在所有请求类型下执行,GET请求的request.POST为空,直接用request.POST['bid']取值找不到对应键就抛出MultiValueDictKeyError - 同时代码还存在多个字段不匹配、表单缺失的问题,会导致后续功能异常:
- 视图里判断出价高低用了不存在的
listing.startBid字段,Post模型对应字段是price/currentBid - 模板item.html里判断创建者用了
listing.owner,Post模型对应字段是listing.creator - item.html缺少出价表单,用户无法提交bid参数
- 视图里判断出价高低用了不存在的
修复方案
1. 修正views.py的viewList视图
def viewList(request, id): # check for the watchlist listing = Post.objects.get(id=id) user = request.user # 无需二次查询User,request.user本身就是User对象 if listing.watchers.filter(id=request.user.id).exists(): is_watched = True else: is_watched = False # 仅处理POST请求 if request.method == "POST": if not listing.activate: if request.POST.get('button') == "Close": listing.activate = True listing.save() else: # 用get取值避免KeyError,取不到就返回错误提示 bid_value = request.POST.get('bid') if not bid_value: return render(request, 'auctions/item.html', { "listing": listing, 'form': BidForm(), "message": "请输入出价金额", "is_watched": is_watched }) price = float(bid_value) bids = listing.bids.all() if user.username != listing.creator.username: # 修正字段名,判断价格要大于当前最高价/起拍价 min_bid = listing.currentBid if listing.currentBid else listing.price if price <= min_bid: return render(request, 'auctions/item.html', { "listing": listing, 'form': BidForm(), "message": "错误!您的出价必须高于当前报价!", "is_watched": is_watched }) form = BidForm(request.POST) if form.is_valid(): bid = form.save(commit=False) bid.user = user bid.save() listing.bids.add(bid) listing.currentBid = price # 修正字段名,存到currentBid listing.save() else: return render(request, 'auctions/item.html', { "form": BidForm(), "listing": listing, "is_watched": is_watched }) return HttpResponseRedirect(reverse('viewList', args=(listing.id,))) context = { 'listing': listing, 'comment_form': CommentForm(), 'comments': listing.get_comments.all(), 'is_watched': is_watched, 'form': BidForm() } return render(request, 'auctions/item.html', context)
2. 修正item.html模板
在出价区域补充出价表单,同时修正创建者判断的字段名:
<div class="newbid"> <p>{{ message }}</p> {% if listing.activate %} <li><strong>中标者:</strong>{{ listing.bids.last.user.username }}</li> {% endif %} {% if user.username == listing.creator.username and not listing.activate %} <form action="{% url 'viewList' listing.id %}" method="POST" class="mb-3"> {% csrf_token %} <button type="submit" name="button" class="btn btn-danger" value="Close">关闭竞价</button> </form> {% endif %} <!-- 补充出价表单 --> {% if not listing.activate and user.username != listing.creator.username %} <form action="{% url 'viewList' listing.id %}" method="POST"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="btn btn-primary mt-2">提交出价</button> </form> {% endif %} </div>
内容的提问来源于stack exchange,提问作者wajd
相关产品推荐
相关产品推荐

