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

Django网页自定义输入表单失效求助:修复手动input表单

Django手动表单提交失效的修复方案

问题描述

在Django项目中创建了两个手动编写的输入表单(收入、支出),均无法正常提交:

  • 收入表单中,{{form_1.as_p}}能正常运行,但手动编写的<input type="text" name="user_input_income">无效
  • 支出表单中,手动编写的<input type="text" name="user_input_withdrawal">同样无效
    需要修复手动编写的表单(重点为支出类表单)的提交功能。

问题根源

  1. 视图中为表单添加了prefix前缀,导致ModelForm期望接收的字段名为前缀-字段名,但手动编写的<input>的name为原始字段名,无法被表单识别,导致验证失败
  2. 循环中复用同一个表单实例,不符合每条记录对应独立表单的需求
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 05:44:54