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
相关产品推荐
相关产品推荐

