Django安全检查表系统数据无法存入数据库问题求助
Django安全检查表数据未存入数据库排查方案
核心排查方向
模型类定义检查
- 确认
models.py中所有需要存储的字段(物业名称、负责人、检查人等)都已正确定义,字段类型匹配业务需求(比如日期用DateField,字符串用CharField并指定max_length)。 - 检查模型是否继承自
models.Model,未继承的模型无法生成数据库表。 - 确认已执行
python manage.py makemigrations和python manage.py migrate命令,新增/修改模型后必须同步数据库结构。
- 确认
视图层数据处理检查
- 确认视图中正确获取POST请求数据:比如
request.POST.get('property_name')的键名和表单字段name一致。 - 检查是否创建模型实例并完成字段赋值,关键:必须调用
instance.save()方法,仅创建实例不会写入数据库。 - 多步表单流程中,需确认前一步的数据是否通过session或其他方式暂存,最后一步能完整获取所有字段值再统一保存。
- 若使用
Form/ModelForm,需确保表单验证通过后调用form.save(),比如if form.is_valid(): form.save()。
- 确认视图中正确获取POST请求数据:比如
模板表单检查
- 表单必须设置
method="post",默认GET请求无法提交数据。 - 表单内必须包含
{% csrf_token %},缺少会导致Django拦截POST请求(无报错但数据无法提交)。 - 表单字段的
name属性必须和模型字段名、视图中取值的键名完全匹配。
- 表单必须设置
代码修正示例参考
模型示例
# models.py from django.db import models class SafetyChecklist(models.Model): property_name = models.CharField(max_length=200) contact_person = models.CharField(max_length=100) inspector = models.CharField(max_length=100) is_safe = models.BooleanField(default=False) department = models.CharField(max_length=100) rectification_deadline = models.DateField(null=True, blank=True) def __str__(self): return self.property_name
视图示例(最后一步保存逻辑)
# views.py from django.shortcuts import render, redirect from .models import SafetyChecklist def save_safety_details(request): if request.method == 'POST': # 从session取出前两步暂存的基础数据 property_name = request.session.get('property_name') contact_person = request.session.get('contact_person') inspector = request.session.get('inspector') # 获取当前页面表单数据 is_safe = request.POST.get('is_safe') == 'on' department = request.POST.get('department') rectification_deadline = request.POST.get('rectification_deadline') # 创建实例并保存到数据库 checklist = SafetyChecklist( property_name=property_name, contact_person=contact_person, inspector=inspector, is_safe=is_safe, department=department, rectification_deadline=rectification_deadline ) checklist.save() # 必须调用该方法 # 清理session中暂存的数据 del request.session['property_name'] del request.session['contact_person'] del request.session['inspector'] return redirect('thank_you') return render(request, 'safety_details.html')
模板表单示例
<!-- safety_details.html --> <form method="post"> {% csrf_token %} <label>是否安全:<input type="checkbox" name="is_safe"></label> <label>部门:<input type="text" name="department"></label> <label>整改截止日期:<input type="date" name="rectification_deadline"></label> <button type="submit">提交</button> </form>
额外验证点
- 查看Django控制台日志,确认是否有数据库操作的SQL语句输出,无输出说明未执行到保存逻辑。
- 在
admin.py中注册模型(admin.site.register(SafetyChecklist)),通过admin后台直接查看数据库是否有数据。
内容的提问来源于stack exchange,提问作者Farhaan Ahmad
相关产品推荐
相关产品推荐

