问题描述
我想使用django的默认密码重设视图“ PasswordResetView”,当用户在查看了教程和问题后,在忘记了密码的模板中忘记了密码时,该模板已经具有我自己建立的视图,发现如何仅在仅用于密码重置的不同模板上使用该密码,但是我不希望用户在忘记密码时转到另一个页面只是为了更改密码,我想在一个主页上的引导模式。
这是我要为其添加PasswordResetView功能的主视图:
def home(request):
user = request.user
signin_form = SigninForm()
signup_form = SignupForm()
if request.method == "POST":
if 'signin_form' in request.POST:
signin_form = SigninForm(request.POST)
if signin_form.is_valid():
email = request.POST['email']
password = request.POST['password']
user = authenticate(email=email,password=password)
if user:
login(request,user)
elif user is None:
messages.error(request,'ُEmail or password is incorrect')
if 'signup_form' in request.POST:
signup_form = SignupForm(request.POST)
if signup_form.is_valid():
signup_form.save()
full_name = signup_form.cleaned_data.get('full_name')
email = signup_form.cleaned_data.get('email')
raw_password = signup_form.cleaned_data.get('password1')
account = authenticate(email=email,password=raw_password)
login(request,account)
context = {'signin_form': signin_form,'signup_form': signup_form}
return render(request,'main/home.html',context)
PS:我尝试从视图中的django的源代码中复制粘贴该视图的源代码(PasswordResetView),但由于基于类的视图而发现了一些错误,因此,如果您找到正确的方法,请指导我做它
或者如果我无法以某种方式合并它们,如何创建自定义的
这是我在其他答案中发现的,它使您可以在仅具有该视图(PasswordResetView)的特定模板中使用它,而不是我想要的:
from django.contrib.auth import views as auth_views
path('password_reset/',auth_views.PasswordResetView.as_view(template_name="myapp/mytemplate.html",form_class=mypasswordresetform),name="reset_password"),
解决方法
我将为您提供一种在django应用程序上具有密码重置功能的简单方法。在编写任何代码之前,让我简要介绍一下该过程。您想要做的就是让用户输入电子邮件,检查是否有该电子邮件的用户,如果有,则通过唯一生成的链接将电子邮件发送到该地址。
从此链接,您应该能够提取需要更改密码的用户对象。一个示例是使用Django的签名模块。该链接仅需要将用户重定向到模板,该模板具有一个包含两个字段的表单,即New Password
和Verify Password
。
如果您使用的是Django的身份验证模块,则Django的通用视图即开即用,但并非强制您使用它,而是最好使用它。
在这里,我仅向您展示如何在与您说的相同的视图上收集电子邮件地址。
def home(request):
# ...your other code
if request.method == 'post':
if 'reset_password' in request.POST:
email = request.POST.get("email","")
user_qs = User.objects.filter(email=email)
if not user_qs.exists():
# send error message to user here
else:
user = user_qs.get()
# send email with uniquely generated url here.
在生成URL和发送邮件的其他方面,我相信您可以分别研究这些内容。但我希望您现在对要搜索的位置和内容有所了解。