首页 > 解决方案 > 如何找到日期时间字段与日期字段匹配但另一个字段为空的 ID?

问题描述

我有一个跟踪员工打卡/打卡应用程序的模型..

class ClockPunch(models.Model):
    employee = models.ForeignKey(settings.AUTH_USER_MODEL)
    date = models.DateField(auto_now_add=True)
    punch_in_time = models.DateTimeField(blank=True, null=True)
    punch_out_time = models.DateTimeField(blank=True, null=True)
    hours_for_the_day = models.DecimalField(max_digits=4, decimal_places=2, default="0.00", blank=True, null=True)

    class Meta:
        ordering = ['date', ]

    def __str__(self):
        return self.pk

和 2 个视图,一个用于打卡,一个用于打卡...

class ClockPunchInView(LoginRequiredMixin, CreateView):
    context_object_name = "clock_punch"
    fields = ['punch_in_time']
    model = ClockPunch
    template_name = 'pages/layout.html'
    success_url = '/'

    def form_valid(self, form):
        object = form.save(commit=False)
        object.employee = self.request.user
        object.punch_in_time = timezone.now()
        object.save()
        return super(ClockPunchInView, self).form_valid(form)


class ClockPunchOutView(LoginRequiredMixin, UpdateView):
    context_object_name = "clock_punch"
    model = ClockPunch
    template_name = 'pages/layout.html'

    def form_valid(self, form):
        object = form.save(commit=False)
        object.employee = self.request.user
        object.punch_out_time = timezone.now()
        object.save()
        return super(ClockPunchOutView, self).form_valid(form)

这是我的实际表格。我这样做是因为我只希望用户可以在顶部导航栏中按下按钮。我计划稍后让这个更ajaxy......

<form method='POST' action='{% url 'administration:clock_in' %}'>
  {% csrf_token %}
  <input type="submit" style="margin-right:6px;" type="button" class="btn btn-success" value="Clock-in"></button>
</form>
<form method='POST' action='{% url 'administration:clock_out' %}'>
  {% csrf_token %}
  <input type="submit" style="margin-right:6px;" type="button" class="btn btn-danger" value="Clock-out"></button>
</form>

签到工作正常,但我需要以某种方式获取最后一个签到的 ID,以便签出视图知道要更新哪一行。我将如何获得最后一个时钟输入的 pk,在时钟输出字段中具有空白或空值?谢谢!

更新:我将对此有所不同,因为我很难在不通过 url 传递 pk 的情况下更新最后一条记录。我每次都会创建一个新条目,并使用最后两个条目让用户找到时间增量。我正在尝试编写一种方法,仅在用户签入时才签出用户,但它不起作用。最后一个条目确实有一个 punched_in = True 但是它的行为好像它没有所以问题必须与我下面的 form_valid 方法有关

class ClockPunchOutView(LoginRequiredMixin, CreateView):
context_object_name = "clock_punch"
model = ClockPunch
fields = ['punch_out_time', 'punched_out',]
#form_class = PunchOutForm
template_name = 'pages/layout.html'
success_url = '/'

def form_valid(self, form):
    object = form.save(commit=False)
    last_entry = ClockPunch.objects.filter(employee=self.request.user).order_by("-punch_in_time").first()

    if last_entry.punched_in:
        object.employee = self.request.user
        object.punch_out_time = timezone.now()
        object.punched_out = True
        object.save()
        return super(ClockPunchOutView, self).form_valid(form)
    else:
        return redirect('/')

标签: django

解决方案


您可以获取该ClockPunch员工的最新条目punch_in_time

object = ClockPunch.objects.filter(employee=self.request.user).order_by("-punch_in_time").first()
object.punch_out_time = timezone.now()
object.save()

推荐阅读