You need to enable JavaScript to run this app. Django自定义表单保存时出现'NoneType'无'disabled'属性AttributeError报错
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义表单保存时出现'NoneType'无'disabled'属性AttributeError报错

报错触发核心原因

你在views.py中写的这段代码直接破坏了Django表单的原有结构:

for i in values_dict:
    form.fields[i] = values_dict[i]

form.fields中存储的是Django表单字段的实例对象(比如CharField、DateField实例),这些对象自带disabled、widget等属性用于表单验证和渲染。你直接把字符串/None等普通值赋值给form.fields[i],相当于把字段实例替换成了普通值,后续表单执行save()逻辑要访问字段的disabled属性时,自然就触发'NoneType' object has no attribute 'disabled'的报错。


其他关联错误点

  1. 表单验证调用错误:你写的if form.is_valid:没有加括号,is_valid是方法不是属性,不加括号等于直接判断方法对象的布尔值,永远为True,完全跳过了表单验证逻辑。
  2. 模板问题:
    • 表单标签缺失enctype="multipart/form-data"属性,无法上传文件,scanned_Form字段永远拿不到值
    • 服务描述的textarea没有加name="description"属性,提交时不会传递description参数
    • 文件上传的input标签name属性值scanned_Form没有加引号,部分浏览器会识别异常
    • approved复选框设置了disabled属性,提交时不会传递该字段值
  3. 数据获取逻辑错误:文件字段不能从request.POST获取,需要从request.FILES获取
  4. 完全多余的手动赋值逻辑:你初始化表单的时候已经传了request.POST和request.FILES,Django表单会自动帮你绑定参数,完全不需要手动拉取request.POST的值再赋值给表单。

修复方案

第一步:修正views.py逻辑

删除多余的手动取值、赋值逻辑,修正is_valid调用:

@login_required
def volunteer_instance_creation(request):
    if request.method == 'POST':
        form = VolunteerInstanceForm(request.POST, request.FILES)
        if form.is_valid(): # 加括号调用验证方法
            obj = form.save(commit = False)
            user = User.objects.get(pk = request.user.id)
            obj.student_id = get_student_id(str(user))
            obj.grad_year = get_grad_year(str(user))
            obj.save()
            return redirect("submission_success")
    else:
        form = VolunteerInstanceForm()
    # 把表单对象传给模板,用于错误提示
    return render(request, "members_only/yes_form.html", {"form": form})

第二步:修正模板代码

<!-- 表单标签新增enctype属性支持文件上传 -->
<form action = '.' method = "POST" enctype="multipart/form-data"> 
    {% csrf_token %}
    <div class="form-group row">
        <label class="col-sm-12 col-md-2 col-form-label">Nonprofit Agency</label>
        <div class="col-sm-12 col-md-10">
            <input class="form-control" type="text" placeholder = "Nonprofit Agency" name = "organization"> 
        </div>
    </div>
    <div class="form-group row">
        <label class="col-sm-12 col-md-2 col-form-label">Supervisor Name</label>
        <div class="col-sm-12 col-md-10">
            <input class="form-control" placeholder="Johnny Brown" type="text" name = "supervisor_Name">
        </div>
    </div>
    <div class="form-group row">
        <label class="col-sm-12 col-md-2 col-form-label">Organization Phone Number</label>
        <div class="col-sm-12 col-md-10">
            <input class="form-control" value="" type="tel" placeholder="Phone number without dashes or parenthesis" name = "supervisor_Phone_Number">
        </div>
    </div>
    <div class="form-group row">
        <label class="col-sm-12 col-md-2 col-form-label">Volunteering Duration</label>
        <div class="col-sm-12 col-md-10">
            <input class="form-control" placeholder="Duration in hours" type="number" name = "volunteering_Duration">
        </div>
    </div>
    <div class="form-group row">
        <label class="col-sm-12 col-md-2 col-form-label">Service Date</label>
        <div class="col-sm-12 col-md-10">
            <input class="form-control date-picker" placeholder="Select Date" type="text" name = "volunteering_Date">
        </div>
    </div>
    <div class="form-group">
        <label>Service Description</label>
        <!-- 新增name属性 -->
        <textarea class="form-control" name="description"></textarea>
    </div>
    <div class="form-group">
        <label>Upload PDF File</label>
        <!-- name属性加引号 -->
        <input type="file" class="form-control-file form-control height-auto" name="scanned_Form">
    </div>
    <div class="custom-control custom-checkbox mb-5">
        <input type="checkbox" class="custom-control-input" id="customCheck1" disabled = "" name = "approved"> 
        <label class="custom-control-label" for="customCheck1">Approved by Admin</label>
    </div>
    <input type = "submit" class = "btn btn-success" value = "Submit" name = "submit"/> 
</form>
<!-- 新增字段级错误提示,方便调试 -->
{% if form.non_field_errors %}
        {% for error in form.non_field_errors %}
            <p class="text-danger">{{ error }}</p>
        {% endfor %}
{% endif %}
{% for field in form %}
    {% if field.errors %}
        {% for error in field.errors %}
            <p class="text-danger">{{ field.label }}: {{ error }}</p>
        {% endfor %}
    {% endif %}
{% endfor %}

可选优化

因为你模板里的approved字段是禁用状态,用户无法修改,建议在表单的Meta类的fields列表中移除approved字段,创建实例的时候默认取False即可,避免不必要的校验。另外forms.py中的get_service_date方法取的是cleaned_data.get('date'),但实际字段名是volunteering_Date,如果要用到该方法需要修改对应的字段名。


内容的提问来源于stack exchange,提问作者SaiPra Manik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 20:36:00