Добавьте два значения времени и отобразите их в шаблоне

У меня возникли проблемы с тем, как правильно отобразить сложение двух значений времени в шаблоне. Вот мой код.

models.py

class UserTimesheet(models.Model):
    employee = models.ForeignKey(Employee, models.SET_NULL, blank=True, null=True)
    date = models.DateField()
    monday_start_time = models.TimeField(_(u"Start Time"), null=True, blank=True)
    monday_end_time = models.TimeField(_(u"End Time"), null=True, blank=True, )

    @property  
    def get_monday_total(self):
        if self.monday_start_time is not None and self.monday_end_time is not None:
            return self.monday_end_time - self.monday_start_time

Я пробовал использовать:

{{ get_monday_total }}
{{ UserTimesheet.get_monday_total }}

И еще много разных вещей, но я никак не могу понять, как отобразить эту логику в шаблоне. Есть идеи?

Любая помощь будет принята с благодарностью.


EDIT

views.py

@login_required(login_url="/login")
def manage_timesheet(request, pk):
    time = UserTimesheet.objects.all()

    queryset = UserTimesheet.objects.get(id=pk)
    form = Timesheet(instance=queryset)

    if request.method == 'POST':
        form = Timesheet(request.POST, instance=queryset)
        if form.is_valid():
            form.save()
            return redirect('/timehub')

    return render(request, 'newtimesheet/manage_timesheet.html', {"form": form, "queryset": queryset, "time": time})

Первая проблема заключается в том, что вы не можете вычесть два time. В качестве обходного пути можно использовать datetime:

from datetime import datetime, time, date

monday_start_time = time(14, 30)
monday_end_time = time(17)
delta = (datetime.combine(date.min, monday_end_time) - datetime.combine(date.min, monday_start_time))
print(delta)
# 2:30:00

Более того, поскольку вы передаете queryset (который следует переименовать, поскольку .get возвращает экземпляр, а не кверисет), вам следует использовать {{ queryset.get_monday_total }} в своем шаблоне.

Основная проблема, которую я вижу, заключается в вашем методе свойства get_monday_total. Вы не можете вычесть 2 значения TimeField таким образом и получить правильно отформатированное время.

Обновите свой get_monday_total() следующим образом:

from datetime import datetime  #import this if not already exists  
@property
def get_monday_total(self):
        if self.monday_start_time and self.monday_end_time:
            duration = datetime.combine(datetime.min, self.monday_end_time) - datetime.combine(datetime.min, self.monday_start_time)
            return "{:02}h {:02}m".format(duration.seconds // 3600, (duration.seconds // 60) % 60)
        return None
 #Sample Output: 08h 30m

Вы можете использовать это в своем шаблоне следующим образом views.py:

<p>Monday Total Time: {{ queryset.get_monday_total }}</p>

{% for timesheet in time %}
    <p>Monday Total Time: {{ timesheet.get_monday_total }}</p>
{% endfor %}
Вернуться на верх