为什么重新加载是在 django 中提交表单?

Why reloading is submitting the form in django?

我有一个登录视图功能,它会在 3 次登录尝试失败后阻止用户

函数如下

def my_login(request):
  context = {}
  if request.method == 'POST':
    form = LoginForm(request.POST)
    user_id = form.cleaned_data['user_id']
    user_password = form.cleaned_data['password1']
    if form.is_valid:
      try:
        usr = Users.objects.get(pk=user_id)
      except:
        context['form'] = form
        context['msg'] = "User Not Found"
        return render(request, 'login.html', context)
      
      '''
      ## code for blocking 
      '''

      if user_password == usr.password1:
        usr.login_attempt = 0
        usr.save()
        login(usr)
        return redirect('dashbord')
      else:
        usr.login_attempt += 1
        usr.save()
        context['msg'] = f"Attempts tried { str(usr.login_attempt)}"
        form = LoginForm()
        context['form'] = form
  return render(request, 'login.html', context)
      

这里的问题是,当我输入错误的密码时,它正在呈现到登录页面,但是当我单击重新加载时,表单再次重新提交并且 login_attempt 得到已更新

我不想要这种行为,所以如何才能停止在单击重新加载时重新提交表单

我假设的一个可能的解决方案是像 request = HttpRequest() 一样在视图中操作请求对象,但它在 csrf 验证时失败。有没有可能解决这个问题

当密码错误时,您需要在成功提交表单后重定向到相同的视图,而不是重新呈现视图。您可以利用 Django 的消息传递框架来传递消息 https://docs.djangoproject.com/en/dev/ref/contrib/messages/

from django.contrib import messages

    else:
        usr.login_attempt += 1
        usr.save()
        messages.warning(request, f"Attempts tried { str(usr.login_attempt)}")
        return redirect(reverse('login')) # or whatever your url is called

然后在你的模板中是这样的:

{% if messages %}
  {% for message in messages %}
    <p>{{ message }}</p>
  {% endfor %}
{% endif %}