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

