Я использую таймер как часть моего приложения. Пользователь может нажать кнопку, чтобы запустить или остановить его, что обновляет его DurationField в базе данных. От пользователя я получаю только действие отправки, которое запускает мое представление для получения данных, поступающих в базу данных.
Вопрос: требуется ли метод post, учитывая, что данные, поступающие в базу данных, не являются строкой или целым числом пользователя, а генерируются из представления? Есть ли лучшая практика?
models.py
class Timer(models.Model):
timer_start = models.DateTimeField(auto_now_add=True)
final_duration = models.DurationField(null=True)
def __str__(self):
timer_start_f = self.timer_start.strftime("%Y-%m-%d %H:%M:%S")
return f"Created: {timer_start_f}"
def isActive(self):
if self.final_duration is None:
return True
else:
return False
def stop(self):
if self.isActive():
self.final_duration = timezone.now() - self.timer_start
self.save()
def time(self):
if self.isActive():
timedelta = timezone.now() - self.timer_start
return f"{timedelta}".split(".")[0]
else:
return f"{self.final_duration}".split(".")[0]
def timer_start_f(self):
return self.timer_start.strftime("%B %d, %Y, %H:%M %p")
urls.py
urlpatterns = [
path('', views.indexView, name='index'),
path('account/', views.timerView, name='timer')
]
views.py
def timerView(request):
try:
timer = Timer.objects.latest('timer_start')
except Timer.DoesNotExist:
if request.method == 'POST':
Timer.objects.create()
return HttpResponseRedirect("/account/")
else:
return render(request, 'pomodoro/timer.html', {'button_label': "Start Timer"})
else:
timer_list = Timer.objects.order_by('-timer_start')[1:]
if request.method == 'POST':
if timer.isActive():
timer.stop()
else:
Timer.objects.create()
return HttpResponseRedirect("/account/")
else:
# "state" is used by javascript to run or stop the timer
if timer.isActive():
button_label = "Stop Timer"
state = "active"
else:
button_label = "Start Timer"
state = "not active"
return render(request, 'pomodoro/timer.html', {'button_label': button_label, 'state': state, 'timer': timer, 'timer_list': timer_list})