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

重构Django库存应用时表单无法发送POST请求求助

表单无法发送POST请求的排查与解决

核心问题1:提交按钮不在表单标签范围内

当前模板里的<button>元素写在了<form>标签闭合之后,点击按钮时不会触发表单的POST请求——因为按钮不属于该表单的一部分。

修正后的模板代码:

{% extends "inventory/base.html" %} {% block content%}
<form action="{% url 'add_stock' part_id %}" method="post">
    {% csrf_token %} 
    {{ form }}
    <!-- 将提交按钮移入表单内部 -->
    <button type="submit" name="confirm">Confirm</button>
    <button type="submit" name="cancel">Cancel</button>
</form>
{% if messages %}
<ul class="messages">
    {% for message in messages %}
        <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
          {{ message }}</li>
    {% endfor %}
</ul>
{% endif %}
{% endblock %} 

核心问题2:表单action路径硬编码易出错

原模板中action="inventory/stock/{{part_id}}"是相对路径,可能会因当前页面URL层级导致请求路径错误。改用Django的{% url %}标签根据URL名称生成绝对路径,确保请求能精准发送到目标视图。

额外优化:视图中完善POST请求处理逻辑

即使POST请求能正常发送,当前视图也未对表单数据做验证和处理,补充这部分逻辑让功能完整:

修正后的视图函数:

@login_required
def add_stock_page(request, part_id):
    user = request.user
    title = 'Add Stock'
    
    if request.method == 'POST':
        form = StockForm(request.POST)
        if 'confirm' in request.POST:
            if form.is_valid():
                # 处理表单数据,关联对应零件后保存
                stock = form.save(commit=False)
                stock.part_id = part_id
                stock.save()
                messages.info(request, '库存添加成功')
            else:
                messages.error(request, '表单数据有误,请检查')
        elif 'cancel' in request.POST:
            messages.info(request, '操作已取消')
    else:
        form = StockForm()
        
    return render(request, 'inventory/addStock.html',{
        'user': user,
        'form': form,
        'title': title,
        'part_id': part_id
    })

表单定义的冗余问题

你在StockForm中手动定义了price字段,但Meta.fields里也包含该字段,会导致字段重复。移除手动定义的price即可:

修正后的表单定义:

class StockForm(forms.ModelForm):
    quantity = forms.IntegerField(required=True, label='Quantity')
    
    class Meta:    
        model = Stock
        fields = [
            'supplier_id',
            'brand_id',
            'price'
        ] 
        labels ={
            'supplier_id':'Supplier',
            'brand_id':'Brand',
            'price':'Price'
        }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:46:08