Добавьте два значения времени и отобразите их в шаблоне
У меня возникли проблемы с тем, как правильно отобразить сложение двух значений времени в шаблоне. Вот мой код.
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 %}