鱼C论坛

 找回密码
 立即注册
查看: 2204|回复: 4

[已解决]django验证码跳转链接问题

[复制链接]
发表于 2023-5-5 16:22:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
20230505161726.png



django原来这页面没有验证码的,先跳转到 class ResetPasswordView ,现在想加了验证码后,先跳到resetpass 验证码验证后,再跳回 class ResetPasswordView 继续执行?



  1. from django.contrib.auth.views import  PasswordResetView
  2. from django.contrib.messages.views import SuccessMessageMixin

  3. def resetpass(request):
  4.     if request.method == 'POST':
  5.         reset_form = ResetPasswordForm(request.POST)
  6.         print("reset_form.is_valid",reset_form.is_valid())
  7.         if reset_form.is_valid():
  8.             capt = reset_form.cleaned_data.get("captcha") #用户提交的验证码
  9.             Hashkey = reset_form.cleaned_data.get("hashkey")
  10.             jc=jarge_captcha(request, capt, Hashkey)
  11.             print("profile jarge_captcha",jc,capt,Hashkey)
  12.             if jc==False:
  13.                 reset_form.add_error('captcha',ValidationError('验证码错误'))
  14.                
  15.             else:
  16.                 ResetPasswordView()
  17.    
  18.         else:
  19.             print("reset_form is_valid")
  20.             email = reset_form.cleaned_data.get('email')
  21.             messages.success(request, f'{email} Your email is valid')
  22.     else:
  23.         reset_form = ResetPasswordForm(instance=request.email)
  24.     return render(request, 'users/password_reset.html', {'reset_form': reset_form})


  25. class ResetPasswordView(SuccessMessageMixin, PasswordResetView):                    
  26.     template_name = 'users/password_reset.html'
  27.     email_template_name = 'users/password_reset_email.html'
  28.     subject_template_name = 'users/password_reset_subject'
  29.     success_message = "如果您输入的电子邮件存在一个帐户,我们会通过电子邮件向您发送设置密码的说明。 " \
  30.                       "您应该很快就会收到它们。 如果您没有收到电子邮件," \
  31.                       " 请确保您输入了您注册时使用的地址,并检查您的垃圾邮件文件夹。 "
  32.     success_url = reverse_lazy('users-home')
复制代码
最佳答案
2023-5-6 17:26:57
abababab 发表于 2023-5-6 17:21
大佬,没看明白, url是先访问到了 class CustomResetPasswordView

怎么关联访问到 def resetpass(req ...

抱歉刚刚的回复与您的问题无关,现在回答您的问题:

要实现您的需求,关于在跳转到 ResetPasswordView 前验证验证码,您可以对 ResetPasswordView 进行重写,覆盖其 post 方法以实现先验证验证码,验证成功后再执行密码重置操作。具体修改如下:

首先,将 resetpass 函数内容移动至 class ResetPasswordView 内,并重命名为 check_captcha .

  1. class ResetPasswordView(SuccessMessageMixin, PasswordResetView):  
  2.     ...

  3.     def check_captcha(self, request):
  4.         reset_form = self.get_form()

  5.         if reset_form.is_valid():
  6.             capt = reset_form.cleaned_data.get("captcha") # 用户提交的验证码
  7.             hash_key = reset_form.cleaned_data.get("hash_key")
  8.             jc = jarge_captcha(request, capt, hash_key)
  9.             if jc==False:
  10.                 reset_form.add_error('captcha', ValidationError('验证码错误'))
  11.                 return False
  12.             else:
  13.                 return True
  14.         else:
  15.             return False
复制代码


接着,在 ResetPasswordView 中重写 post 方法,在调用 super() 执行原有密码重置逻辑前,先判断 check_captcha 的返回值。

  1. class ResetPasswordView(SuccessMessageMixin, PasswordResetView):
  2.     ...

  3.     def post(self, request, *args, **kwargs):
  4.         is_captcha_valid = self.check_captcha(request)
  5.         if is_captcha_valid:
  6.             return super().post(request, *args, **kwargs)
  7.         else:
  8.             return self.render_to_response(self.get_context_data())
复制代码


这样,当用户提交表单时,会先执行 check_captcha 方法检查验证码是否正确,如果正确,再执行 ResetPasswordView 的原有逻辑。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-5-6 15:00:49 | 显示全部楼层
有大佬在么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-6 15:28:31 | 显示全部楼层
要在验证码验证成功后重定向到 ResetPasswordView 并执行它,您可以将 ResetPasswordView 的调用更改为 HttpResponseRedirect 。请将 from django.http import HttpResponseRedirect 添加到您的导入列表中。然后,使用 reverse_lazy 来构建重定向到 ResetPasswordView 的URL。还要确保 ResetPasswordView 在视图中具有唯一的名称(例如,将其更改为 CustomResetPasswordView )。

此外,您还需要在 urls.py 中更新 ResetPasswordView 的URL路径名称。接下来,请按照以下步骤更新您的代码:

1. 更改 ResetPasswordView 的类名为 CustomResetPasswordView 。
2. 在 resetpass 视图中,使用 HttpResponseRedirect 替换 ResetPasswordView() 。
3. 更新 urls.py 中的 ResetPasswordView 路径名称。

这是更新后的代码:

  1. from django.contrib.auth.views import PasswordResetView
  2. from django.contrib.messages.views import SuccessMessageMixin
  3. from django.http import HttpResponseRedirect
  4. from django.urls import reverse_lazy

  5. # ... (the rest of your imports) ...


  6. def resetpass(request):
  7.     # ... (the rest of your resetpass view) ...
  8.     else:
  9.         if jc:
  10.             return HttpResponseRedirect(reverse_lazy('custom-password-reset'))
  11.         else:
  12.             reset_form.add_error('captcha', ValidationError('验证码错误'))

  13.     # ... (the rest of your resetpass view) ...


  14. class CustomResetPasswordView(SuccessMessageMixin, PasswordResetView):
  15.     # ... (the rest of your CustomResetPasswordView) ...
复制代码


接下来,更新 urls.py :

  1. from django.urls import path
  2. from . import views

  3. urlpatterns = [
  4.     # ... (other urlpatterns) ...

  5.     path('reset-password/', views.CustomResetPasswordView.as_view(), name='custom-password-reset'),

  6.     # ... (other urlpatterns) ...
  7. ]
复制代码


现在,在验证码验证成功后,视图将重定向到 CustomResetPasswordView 并执行该视图。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-6 17:21:03 | 显示全部楼层
isdkz 发表于 2023-5-6 15:28
要在验证码验证成功后重定向到 ResetPasswordView 并执行它,您可以将 ResetPasswordView 的调用更改为 Htt ...

大佬,没看明白, url是先访问到了 class CustomResetPasswordView

怎么关联访问到 def resetpass(request)函数呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-6 17:26:57 | 显示全部楼层    本楼为最佳答案   
abababab 发表于 2023-5-6 17:21
大佬,没看明白, url是先访问到了 class CustomResetPasswordView

怎么关联访问到 def resetpass(req ...

抱歉刚刚的回复与您的问题无关,现在回答您的问题:

要实现您的需求,关于在跳转到 ResetPasswordView 前验证验证码,您可以对 ResetPasswordView 进行重写,覆盖其 post 方法以实现先验证验证码,验证成功后再执行密码重置操作。具体修改如下:

首先,将 resetpass 函数内容移动至 class ResetPasswordView 内,并重命名为 check_captcha .

  1. class ResetPasswordView(SuccessMessageMixin, PasswordResetView):  
  2.     ...

  3.     def check_captcha(self, request):
  4.         reset_form = self.get_form()

  5.         if reset_form.is_valid():
  6.             capt = reset_form.cleaned_data.get("captcha") # 用户提交的验证码
  7.             hash_key = reset_form.cleaned_data.get("hash_key")
  8.             jc = jarge_captcha(request, capt, hash_key)
  9.             if jc==False:
  10.                 reset_form.add_error('captcha', ValidationError('验证码错误'))
  11.                 return False
  12.             else:
  13.                 return True
  14.         else:
  15.             return False
复制代码


接着,在 ResetPasswordView 中重写 post 方法,在调用 super() 执行原有密码重置逻辑前,先判断 check_captcha 的返回值。

  1. class ResetPasswordView(SuccessMessageMixin, PasswordResetView):
  2.     ...

  3.     def post(self, request, *args, **kwargs):
  4.         is_captcha_valid = self.check_captcha(request)
  5.         if is_captcha_valid:
  6.             return super().post(request, *args, **kwargs)
  7.         else:
  8.             return self.render_to_response(self.get_context_data())
复制代码


这样,当用户提交表单时,会先执行 check_captcha 方法检查验证码是否正确,如果正确,再执行 ResetPasswordView 的原有逻辑。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-29 02:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表