Используя метод.публикация без данных

#django

#django

Вопрос:

Я использую таймер как часть своего приложения. Пользователь может нажать кнопку, чтобы запустить или остановить ее, что обновит ее 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. вы можете использовать простую форму: docs.djangoproject.com/en/2.1/topics/forms/… . У вас может быть форма, не являющаяся собственностью, без проблем.

2. Да, но в этом случае вопрос был бы таким: «Когда вы оборачиваете свою форму в шаблон тегом form, используете ли вы метод POST или GET?»

Ответ №1:

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

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

Комментарии:

1. Если я решу использовать POST, нужен ли мне все еще {% csrf_token %} в этой ситуации??

2. ДА. Вы не хотите создавать это представление csrf_exempt