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'的报错。
其他关联错误点
- 表单验证调用错误:你写的
if form.is_valid:没有加括号,is_valid是方法不是属性,不加括号等于直接判断方法对象的布尔值,永远为True,完全跳过了表单验证逻辑。 - 模板问题:
- 表单标签缺失
enctype="multipart/form-data"属性,无法上传文件,scanned_Form字段永远拿不到值 - 服务描述的
textarea没有加name="description"属性,提交时不会传递description参数 - 文件上传的
input标签name属性值scanned_Form没有加引号,部分浏览器会识别异常 approved复选框设置了disabled属性,提交时不会传递该字段值
- 表单标签缺失
- 数据获取逻辑错误:文件字段不能从
request.POST获取,需要从request.FILES获取 - 完全多余的手动赋值逻辑:你初始化表单的时候已经传了
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
相关产品推荐
相关产品推荐

