在我自己的视图中使用django passwordresetview功能

问题描述

我想使用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 PasswordVerify 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和发送邮件的其他方面,我相信您可以分别研究这些内容。但我希望您现在对要搜索的位置和内容有所了解。