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

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>

问题根源

  1. 两个表单未设置区分标识,提交时默认走当前页面视图,视图无法判断用户执行的是哪个操作。
  2. page_product视图在渲染页面时就执行了拍卖关闭逻辑,而非点击Close按钮后触发。
  3. 直接修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 07:11:01