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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:17:08