首页 > 解决方案 > 未找到重置密码表单页面

问题描述

我在 Django 中构建了一个自定义密码重置,但是,在将信息放入后,'PasswordResetForm'我得到一个 404 page not found 错误。

这是我的 reset_password 代码:

def reset_password(request,username):
    if request.method == 'POST':
        form = PasswordResetForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            #added this to redirect user to custom url
            username = request.user.username
            return redirect(reverse('main:home', kwargs={'username': username})) 
            #return redirect(reverse('main:home'))
        else:
            return redirect(reverse('main:reset_password'))
    else:
        form = PasswordResetForm(user=request.user)
        args = {'form': form}
        return render(request, 'reset_password.html', args)

我在 myapp/urls.py 的网址

urlpatterns=[
    path('signup/',views.signup,name='signup'),
    path('login',views.user_login,name='user_login'),
    path('',views.main_page,name='main_page'),
    path('<str:username>', views.home, name='home'),
    #replace home/edit with below
    path('<str:username>/edit', views.edit_profile, name='edit_profile'),
    path('<str:username>/password-reset', views.reset_password, name='reset_password'),
]

和我的密码重置表格:

class PasswordResetForm(PasswordChangeForm):

    class Meta:
        model = Profile
        fields = ('old_password','new_password1','new_password2')

这里似乎有什么问题?我不知道为什么会收到此错误:

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/main/test3-b/login.html?next=/main/test3-b/password-reset

这是我在 models.py 中的 AbstractUser 模型(我的 models.py 中没有任何其他代码

class Profile(AbstractUser):
    bio = models.TextField() 
    university = models.CharField(max_length=30)

    def __str__(self):
        return self.username

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


您的 urls.py 没有使用与您正在访问的 URL 相同的路径。您给出的 URL 示例是http://127.0.0.1:8000/main/test3-b/login.html但您的密码重置 url 类似于http://127.0.0.1:8000/example-user/password-重置example-user您尝试在路径中匹配的用户名在哪里。

出于兴趣,您是否在 URL 结构中包含用户名?这通常是不需要的,因为您将使用 request.user 来访问当前用户。当您使用 str 而不是 slug 时,您还面临用户用户名可能会破坏您的模式的风险,这在 URL 模式中更安全,否则 id 用户是使用“example/edit”的用户名创建的,那么他们将永远无法获得到您的主页,因为它会匹配 edit_profile 条目。


推荐阅读