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

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("数据保存成功")

验证方法

  1. 查看Django终端日志,确认POST请求的SQL执行记录;
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:25:16