Django按钮功能异常排查:关闭按钮执行错误功能
问题:Close按钮误触发收藏功能的修复方案
问题描述
点击Close按钮本应结束拍卖并宣布最高出价者获胜,但实际执行的是添加/移除商品至收藏列表的功能。
背景说明
- 收藏按钮:通过
form.py创建表单,在page_product视图中传入模板,用户点击可添加/移除商品至收藏列表。 - Close按钮:仅商品卖家可见,预期触发拍卖关闭逻辑。
相关代码
views.py
def page_product(request, productid): product = get_object_or_404(Product, pk=productid) off = Bid_info.objects.get(product=product) bid_max = Bid_info.objects.filter(product_id=productid).latest('bid_price') if request.user == off.seller: close_button = True off.bid_price = bid_max Bid_info.checkclose = True messages.success(request, f"The offer was closed at {bid_max} $") else: close_button = False context = { 'product' : product, 'form': form, 'off' : off, 'close_button' : close_button, 'bid_max' : bid_max } return render(request, 'auctions/page_product.html', context) def bid(request, bidid): product = get_object_or_404(Product, pk=bidid) if request.method == 'POST': user = request.user if user.is_authenticated: bid_price = Decimal(request.POST.get("bid_price", False)) other_off = Bid_info.objects.filter(product=product).order_by("-bid_price").first() if Bid_info.checkclose == True: messages.warning(request, "it sells.") else: Bid_ = Bid_info(product=product, seller=request.user, bid_price=bid_price) Bid_.save() return redirect('page_product', bidid)
page_product.html
<form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit" class="rectangle-button"> {% if product.active_bool %} <div style="background-color: red;"> remove</div> {% else %} <div style="background-color: green;">add</div> {% endif %} </button> </form> <form method="post"> {% csrf_token %} {% if close_button %} <button type="submit" class="btn btn-primary">Close</button> {% else %} <p> {{off.seller}} is seller!</p> {% endif %} </form>
问题根源
- 两个表单未设置区分标识,提交时默认走当前页面视图,视图无法判断用户执行的是哪个操作。
page_product视图在渲染页面时就执行了拍卖关闭逻辑,而非点击Close按钮后触发。- 直接修改
Bid_info.checkclose类属性,会导致所有拍卖被批量关闭,而非当前商品的单独拍卖。
修复步骤
1. 修改模板表单,添加操作标识
给两个表单分别添加隐藏字段区分操作类型,确保视图能识别提交请求:
<!-- 收藏按钮表单 --> <form method="post" action="{% url 'page_product' product.id %}"> {% csrf_token %} {{ form.as_p }} <input type="hidden" name="action" value="toggle_favorite"> <button type="submit" class="rectangle-button"> {% if product.active_bool %} <div style="background-color: red;">移除收藏</div> {% else %} <div style="background-color: green;">添加收藏</div> {% endif %} </button> </form> <!-- Close按钮表单 --> <form method="post" action="{% url 'page_product' product.id %}"> {% csrf_token %} {% if close_button %} <input type="hidden" name="action" value="close_auction"> <button type="submit" class="btn btn-primary">Close</button> {% else %} <p>{{ off.seller }} 是卖家!</p> {% endif %} </form>
2. 修复page_product视图逻辑
将拍卖关闭逻辑移至POST请求处理中,区分不同操作:
def page_product(request, productid): product = get_object_or_404(Product, pk=productid) off = get_object_or_404(Bid_info, product=product) bid_max = Bid_info.objects.filter(product_id=productid).latest('bid_price') close_button = request.user == off.seller # 处理POST请求 if request.method == 'POST': action = request.POST.get('action') if action == 'toggle_favorite': # 执行收藏/取消收藏逻辑(替换为你实际的表单处理代码) form = FavoriteForm(request.POST, instance=product) if form.is_valid(): form.save() elif action == 'close_auction' and close_button: # 执行当前商品的拍卖关闭逻辑 off.bid_price = bid_max off.checkclose = True # 修改实例属性而非类属性 off.save() messages.success(request, f"拍卖已结束,最终成交价为 {bid_max} $") return redirect('page_product', productid) # 初始化收藏表单 form = FavoriteForm(instance=product) context = { 'product' : product, 'form': form, 'off' : off, 'close_button' : close_button, 'bid_max' : bid_max } return render(request, 'auctions/page_product.html', context)
3. 修正bid视图的错误判断
将类属性检查改为实例属性检查:
def bid(request, bidid): product = get_object_or_404(Product, pk=bidid) off = get_object_or_404(Bid_info, product=product) if request.method == 'POST': user = request.user if user.is_authenticated: bid_price = Decimal(request.POST.get("bid_price", 0)) other_off = Bid_info.objects.filter(product=product).order_by("-bid_price").first() if off.checkclose: messages.warning(request, "该拍卖已结束,无法出价。") else: Bid_info.objects.create(product=product, seller=request.user, bid_price=bid_price) return redirect('page_product', bidid)
内容的提问来源于stack exchange,提问作者zahra
相关产品推荐
相关产品推荐

