Django员工考勤数据无法存入数据库且无报错求助
考勤数据无法存入数据库的排查与修复方案
问题背景
已实现员工考勤的模型、表单和视图函数,但提交数据后无法存入数据库且无任何报错,相关代码如下:
表单代码
class AttendanceForm(forms.ModelForm): class Meta: model = Attendance fields = '__all__'
模型代码
class Employee(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, default=1) eid = models.IntegerField(primary_key=True) salary = models.IntegerField() gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default=1) contactno = models.CharField(max_length=10) email = models.CharField(max_length=30) country = models.CharField(max_length=30) city = models.CharField(max_length=20) pincode = models.IntegerField() address = models.CharField(max_length=60) def __str__(self): return self.user.first_name + ' ' + self.user.last_name class Attendance(models.Model): employee = models.ForeignKey(Employee, on_delete=models.CASCADE, default=1) attendancedate = models.DateField() in_time = models.TimeField() out_time = models.TimeField() description = models.TextField() def __str__(self): return str(self.employee)
视图函数代码
@csrf_exempt def addattendance(request): form = AttendanceForm() emp_list = Employee.objects.all() if request.method == 'POST': form = AttendanceForm(request.POST) if form.is_valid(): form.save(commit=True) return redirect('employee/detail_attendance') return render(request, 'employee/addattendance.html', {'form': form, 'emp_list': emp_list})
排查与修复步骤
1. 表单验证失败无反馈
视图仅在form.is_valid()为True时执行保存,若验证失败直接跳过但无提示,导致误以为提交成功。
修改视图:保留验证失败时的表单上下文,让模板渲染错误信息:
def addattendance(request): # 移除@csrf_exempt,改用CSRF令牌更安全 form = AttendanceForm() emp_list = Employee.objects.all() if request.method == 'POST': form = AttendanceForm(request.POST) if form.is_valid(): form.save() return redirect('employee/detail_attendance') # 验证失败时,form携带错误信息返回模板 return render(request, 'employee/addattendance.html', {'form': form, 'emp_list': emp_list})
模板添加错误提示:在addattendance.html中加入错误渲染逻辑:
{% if form.errors %} <div style="color: red;"> {% for field in form %} {% for error in field.errors %} <p>{{ field.label }}: {{ error }}</p> {% endfor %} {% endfor %} {% for error in form.non_field_errors %} <p>{{ error }}</p> {% endfor %} </div> {% endif %} <form method="POST"> {% csrf_token %} <!-- 必须添加CSRF令牌 --> {{ form.as_p }} <button type="submit">提交考勤</button> </form>
2. CSRF令牌缺失或滥用@csrf_exempt
@csrf_exempt会绕过CSRF验证,但若模板未加{% csrf_token %},部分场景下Django会静默拒绝请求。建议移除@csrf_exempt,改用标准CSRF令牌验证。
3. 模型外键默认值无效
Attendance模型中employee字段设置default=1,若数据库中不存在ID为1的员工,会触发外键约束错误,但可能因未捕获异常导致静默失败。
修复:
- 检查数据库是否存在ID为1的员工记录,不存在则创建或修改default为有效ID;
- 移除default参数,让表单强制选择员工(更符合业务逻辑)。
4. 日期时间字段格式不匹配
模板提交的日期/时间格式不符合Django默认解析规则,导致表单验证失败。
修复:在表单中使用HTML5日期时间控件,确保格式合规:
class AttendanceForm(forms.ModelForm): attendancedate = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'})) in_time = forms.TimeField(widget=forms.TimeInput(attrs={'type': 'time'})) out_time = forms.TimeField(widget=forms.TimeInput(attrs={'type': 'time'})) class Meta: model = Attendance fields = '__all__'
5. 重定向目标错误
若redirect('employee/detail_attendance')中的URL名称不存在,会导致重定向失败,但数据可能已保存。可临时注释重定向代码,验证数据是否入库:
if form.is_valid(): form.save() # return redirect('employee/detail_attendance') return HttpResponse("数据保存成功")
验证方法
- 查看Django终端日志,确认POST请求的SQL执行记录;
- 在Django Shell中手动测试表单验证:
from employee.forms import AttendanceForm data = { 'employee': 1, # 替换为真实存在的员工ID 'attendancedate': '2024-05-20', 'in_time': '09:00:00', 'out_time': '18:00:00', 'description': '正常出勤' } form = AttendanceForm(data) print(form.is_valid()) print(form.errors)
内容的提问来源于stack exchange,提问作者Nishant Sharma
相关产品推荐
相关产品推荐

