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

Django表单单选按钮值无法提交且无终端输出问题求助

Django表单提交问题:单选按钮提交无响应,选中opt0时需执行更新操作

提交单选按钮表单后,表单未成功提交,终端无任何输出。需实现表单正常提交,且选中opt0选项时执行对应的更新操作。


原代码

HTML代码

<form action = "." method = "post">
    <div class="form_data">
        {% csrf_token %}
        <br><br>
        {{form.myfield}}
        <br><br>
        <input type="submit" value="Submit" class="btn btn-success" />
    </div>
</form>

forms.py代码

class TestForm(forms.ModelForm):
    class Meta:
        model = TestModel
        fields = "__all__"
        widgets = {'myfield': forms.RadioSelect()}

models.py代码

class TestModel(models.Model):
    git_Id = models.CharField(max_length=200)
    git_Response = models.CharField(max_length=200)
    is_approved = models.IntegerField()
    MY_CHOICES = (
        ('opt0', 'Approved'),
        ('opt1', 'Not Approved'),
    )
    myfield = models.CharField(max_length=10, choices=MY_CHOICES, default="N/A")

views.py代码

def test(request):
    if request.method == "POST":
        form = TestForm(request.POST)
        if form.is_valid():
            print("Form is Valid")
            selected = form.cleaned_data['myfield']
            print(selected)

            if selected == 'opt0':
                from config import request_id as r
                rq = r["request_id"]
                print(rq)
                s = sql()
                query = f"""update request_form_mymodel
                               set is_approved=1
                               where request_id = '{rq}' """
                print(query)
                s.update_query(query)
            else:
                pass

    else:
        form = TestForm()
    return render(request, 'test.html', {'form': form})

问题原因与修复方案

核心问题

  1. TestForm设置了fields="__all__",但模板仅渲染了myfield字段,git_Id、git_Response、is_approved这些必填字段未提供值,导致form.is_valid()返回False,终端无输出。
  2. 未处理表单验证失败的场景,无法直观看到错误信息。
  3. 直接拼接原生SQL存在SQL注入风险,不符合Django最佳实践。

修复后的代码

1. 修改forms.py:仅保留需要的字段

class TestForm(forms.ModelForm):
    class Meta:
        model = TestModel
        fields = ['myfield']  # 只保留用户需要选择的字段
        widgets = {'myfield': forms.RadioSelect()}

2. 修改views.py:用ORM替代原生SQL,确保逻辑正常执行

def test(request):
    if request.method == "POST":
        form = TestForm(request.POST)
        if form.is_valid():
            print("Form is Valid")
            selected = form.cleaned_data['myfield']
            print(selected)

            if selected == 'opt0':
                from config import request_id as r
                rq = r["request_id"]
                print(rq)
                # 用Django ORM执行更新,避免SQL注入
                TestModel.objects.filter(request_id=rq).update(is_approved=1)
            # 可选:如果需要保存表单实例到数据库,取消注释下面一行
            # form.save()
    else:
        form = TestForm()
    return render(request, 'test.html', {'form': form})

3. 修改HTML模板:添加错误信息展示

<form action="." method="post">
    <div class="form_data">
        {% csrf_token %}
        <br><br>
        {{ form.myfield }}
        
        <!-- 显示表单验证错误,方便调试 -->
        {% if form.errors %}
            <div class="alert alert-danger mt-3">
                {% for field in form %}
                    {% for error in field.errors %}
                        <p>{{ field.label }}: {{ error }}</p>
                    {% endfor %}
                {% endfor %}
                {% for error in form.non_field_errors %}
                    <p>{{ error }}</p>
                {% endfor %}
            </div>
        {% endif %}
        
        <br><br>
        <input type="submit" value="Submit" class="btn btn-success" />
    </div>
</form>

内容的提问来源于stack exchange,提问作者Shaurya Rajput

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:20:33