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

Django数据库更新问题:如何更新考勤记录的end_time字段

解决方案

核心问题是当前考勤模型缺少用户关联和日期标识,导致签退时无法定位到需要更新的具体记录,同时attendance_out视图未实现查找并更新的逻辑。以下是具体修改方案:

1. 完善考勤模型(models.py)

添加用户外键和日期字段,确保每条考勤记录对应特定用户与日期,避免同用户同一天重复创建记录:

from django.contrib.auth.models import User

class Attendance(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="用户")
    date = models.DateField(verbose_name="考勤日期", auto_now_add=True)
    begin_time = models.TimeField(verbose_name="上班时间", null=True, blank=True)
    end_time = models.TimeField(verbose_name="下班时间", null=True, blank=True)

    class Meta:
        unique_together = ('user', 'date')  # 约束同一用户单日仅一条考勤

2. 优化上班打卡视图(views.py)

关联当前登录用户,自动创建/获取当日考勤记录并更新上班时间:

from django.utils import timezone
from django.contrib.auth.decorators import login_required

@login_required  # 限制仅登录用户可操作
def attendance_in(request):
    if request.method == 'GET':
        return render(request, 'attendance_in.html')
    if request.method == 'POST':
        today = timezone.localdate()
        # 获取或创建当前用户当日的考勤记录
        attendance, created = Attendance.objects.get_or_create(
            user=request.user,
            date=today
        )
        attendance.begin_time = request.POST.get('begin_time')
        attendance.save()
        return redirect('/user/attendance/out')

3. 实现下班签退视图(views.py)

定位当前用户当日的考勤记录,更新下班时间:

@login_required
def attendance_out(request):
    if request.method == 'GET':
        return render(request, 'attendance_out.html')
    if request.method == 'POST':
        today = timezone.localdate()
        try:
            # 查找当前用户当日的考勤记录
            attendance = Attendance.objects.get(
                user=request.user,
                date=today
            )
            attendance.end_time = request.POST.get('end_time')
            attendance.save()
            return redirect('/attendance-success/')  # 签退成功跳转页
        except Attendance.DoesNotExist:
            # 处理当日未打卡的异常情况
            return render(request, 'attendance_out.html', {'error': '您今日尚未上班打卡,请先完成打卡'})

补充说明

  • 表单页面需提交HH:MM格式的时间数据,Django的TimeField可直接解析该格式;
  • 若为单用户场景,可移除user字段,但date字段仍需保留以定位当日记录;
  • 需确保项目已配置用户认证系统,@login_required装饰器才能生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:05:23