为什么重新加载是在 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 %}
我有一个登录视图功能,它会在 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 %}