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

Moh*_* CH 6 python django django-forms django-views django-authentication

我想使用 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)

Run Code Online (Sandbox Code Playgroud)

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"),
Run Code Online (Sandbox Code Playgroud)

kin*_*aii 4

我将为您提供一种在 django 应用程序上拥有密码重置功能的简单方法。在编写任何代码之前,让我先简要说明一下该过程。您想要做的是让用户输入他们的电子邮件,检查是否有任何用户拥有该电子邮件,然后如果有,则将带有唯一生成的链接的电子邮件发送到该地址。

从此链接中,您应该能够提取需要更改密码的用户对象。一个例子是使用 django 的签名模块。该链接只需将用户重定向到一个模板,其中有一个包含 2 个字段的表单,即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.

Run Code Online (Sandbox Code Playgroud)

至于生成URL和发送邮件的其他方面,相信大家可以单独研究一下。但我希望您现在知道在哪里搜索以及搜索什么内容。