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})
问题原因与修复方案
核心问题
TestForm设置了fields="__all__",但模板仅渲染了myfield字段,git_Id、git_Response、is_approved这些必填字段未提供值,导致form.is_valid()返回False,终端无输出。- 未处理表单验证失败的场景,无法直观看到错误信息。
- 直接拼接原生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
相关产品推荐
相关产品推荐

