Django网页自定义输入表单失效求助:修复手动input表单
Django手动表单提交失效的修复方案
问题描述
在Django项目中创建了两个手动编写的输入表单(收入、支出),均无法正常提交:
- 收入表单中,
{{form_1.as_p}}能正常运行,但手动编写的<input type="text" name="user_input_income">无效 - 支出表单中,手动编写的
<input type="text" name="user_input_withdrawal">同样无效
需要修复手动编写的表单(重点为支出类表单)的提交功能。
问题根源
- 视图中为表单添加了
prefix前缀,导致ModelForm期望接收的字段名为前缀-字段名,但手动编写的<input>的name为原始字段名,无法被表单识别,导致验证失败 - 循环中复用同一个表单实例,不符合每条记录对应独立表单的需求
- POST请求的判断逻辑依赖前缀后的字段名,与实际提交的字段名不匹配,导致处理代码无法触发
修改方案
1. 调整 views.py
去掉表单的prefix前缀,简化POST请求处理逻辑(两种可选方式):
方式一:直接从POST取值(无需表单验证)
def input(request): items_income = Memo_income.objects.all() items_withdrawal = Memo_withdrawal.objects.all() if request.method == 'POST': # 处理支出记录更新 if 'user_input_withdrawal' in request.POST: item_id = request.POST.get('id') item = get_object_or_404(Memo_withdrawal, id=item_id) item.user_input_withdrawal = request.POST.get('user_input_withdrawal') item.save() return redirect('input') # 处理收入记录更新 elif 'user_input_income' in request.POST: item_id = request.POST.get('id') item = get_object_or_404(Memo_income, id=item_id) item.user_input_income = request.POST.get('user_input_income') item.save() return redirect('input') return render(request, 'report/input.html', { 'items_income': items_income, 'items_withdrawal': items_withdrawal })
方式二:保留ModelForm验证(去掉prefix)
def input(request): items_income = Memo_income.objects.all() items_withdrawal = Memo_withdrawal.objects.all() if request.method == 'POST': # 处理支出记录更新 if 'user_input_withdrawal' in request.POST: form = InputForm2(request.POST) if form.is_valid(): item_id = request.POST.get('id') item = get_object_or_404(Memo_withdrawal, id=item_id) item.user_input_withdrawal = form.cleaned_data['user_input_withdrawal'] item.save() return redirect('input') # 处理收入记录更新 elif 'user_input_income' in request.POST: form = InputForm1(request.POST) if form.is_valid(): item_id = request.POST.get('id') item = get_object_or_404(Memo_income, id=item_id) item.user_input_income = form.cleaned_data['user_input_income'] item.save() return redirect('input') return render(request, 'report/input.html', { 'items_income': items_income, 'items_withdrawal': items_withdrawal })
2. 修改 input.html
删除多余的{{form1.as_p}}标签,保留手动编写的表单结构:
<table> <tr> <th>摘要(存储记录)</th> <th>存款类型(存储记录)</th> <th>修改内容输入</th> </tr> {% for item in items_income %} <tr> <td>{{ item.memo_income }}</td> <td>{{ item.user_input_income }}</td> <td> <form method="post" action=""> {% csrf_token %} <input type="hidden" name="id" value="{{ item.id }}"> <input type="text" name="user_input_income" value="{{ item.user_input_income }}"> <input type="submit" value="Update"> </form> </td> </tr> {% endfor %} </table> <table> <tr> <th>摘要(存储记录)</th> <th>支出类型(存储记录)</th> <th>修改内容输入</th> </tr> {% for item in items_withdrawal %} <tr> <td>{{ item.memo_withdrawal }}</td> <td>{{ item.user_input_withdrawal }}</td> <td> <form method="post" action=""> {% csrf_token %} <input type="hidden" name="id" value="{{ item.id }}"> <input type="text" name="user_input_withdrawal" value="{{ item.user_input_withdrawal }}"> <input type="submit" value="Update"> </form> </td> </tr> {% endfor %} </table>
3. forms.py 无需修改
保持原有的ModelForm定义即可:
class InputForm1(forms.ModelForm): class Meta: model= Memo_income fields=['user_input_income'] class InputForm2(forms.ModelForm): class Meta: model= Memo_withdrawal fields=['user_input_withdrawal']
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

