Django中如何获取表单类未定义的手动添加表单字段值?
问题描述
在Django项目中,需要提交未在Forms类中定义的表单内容,现有代码如下:
forms.py
class AnalyseForm(forms.Form): TYPES = (('a', 'Type A'),('b', 'Type B'), ('c', 'Type C')) filename = forms.FileField(label="Document to Analyse") doctype = forms.ChoiceField(choices=TYPES, label="Doc Type:")
views.py
def AnalyseDoc(request): doctype="" if request.method == "POST": form = AnalyseForm(request.POST, request.FILES) if form.is_valid(): filecontent = request.FILES['filename'] doctype=form.cleaned_data['doctype'] # 尝试获取dummydata但失败 # dummydata=form.cleaned_data['dummydata'] print(dummydata) analyse = analyseStuff(file=filecontent,doctype=doctype, dummydata=dummydata) else: form = AnalyseForm() return render( request, "summary.html", { "dummydata": "x", "form": form, 'filecontent': filecontent, "doctype": doctype, }, )
对应HTML代码
<h1>What file would you like to Analyse?</h1> <form action = "" method = "post" enctype="multipart/form-data"> <div class="form-check form-switch"> <label class="form-check-label" for="dummydata">Use Dummy Data</label> <input class="form-check-input" type="checkbox" role="switch" id="dummydata" checked> </div> {% csrf_token %} {{form | crispy}} <button id="submit" type="submit" class="btn btn-primary">Analyse<button> </form>
无法通过form.cleaned_data获取dummydata的值,使用request.POST.get('dummydata')也无法获取,请问如何在视图函数中获取该字段的值?
解决方法
问题核心是HTML中的checkbox缺少name属性——HTTP表单提交时,只有带有name属性的控件才会将数据发送到后端。
1. 给checkbox添加name属性
修改HTML里的input标签,补充name="dummydata":
<input class="form-check-input" type="checkbox" role="switch" id="dummydata" name="dummydata" checked>
2. 在视图中正确获取值
checkbox的特性是:勾选时会发送dummydata=on(默认值),未勾选时该字段不会出现在request.POST中。因此在视图里可以这样判断:
def AnalyseDoc(request): doctype = "" dummydata = False # 默认未勾选 filecontent = None # 初始化变量避免报错 if request.method == "POST": form = AnalyseForm(request.POST, request.FILES) if form.is_valid(): filecontent = request.FILES['filename'] doctype = form.cleaned_data['doctype'] # 判断checkbox是否被勾选 dummydata = request.POST.get('dummydata') == 'on' print(dummydata) analyse = analyseStuff(file=filecontent, doctype=doctype, dummydata=dummydata) else: form = AnalyseForm() return render( request, "summary.html", { "dummydata": "x", "form": form, 'filecontent': filecontent, "doctype": doctype, }, )
补充:自定义checkbox提交值
如果需要自定义勾选时的提交值,可以给input添加value属性,例如:
<input class="form-check-input" type="checkbox" role="switch" id="dummydata" name="dummydata" value="1" checked>
此时在视图中判断:
dummydata = request.POST.get('dummydata') == '1'
内容的提问来源于stack exchange,提问作者Jon M
相关产品推荐
相关产品推荐

