Использование method.post без данных - PullRequest
0 голосов
/ 25 марта 2019

Я использую таймер как часть моего приложения. Пользователь может нажать кнопку, чтобы запустить или остановить его, что обновляет его 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})

1 Ответ

0 голосов
/ 25 марта 2019

Никто не требует, чтобы вы завернули свои взгляды в POST. Если вы хотите, чтобы кто-то активировал ваш просмотр с помощью параметров GET (то есть, поделился ссылкой с другим пользователем), перейдите с помощью GET.

В противном случае я бы предложил обернуть весь вид в if POST, потому что его значение ближе к манипулированию данными в БД, чем просто выбор и отображение данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...