【问题标题】:Reset Password Form Page not found未找到重置密码表单页面
【发布时间】:2020-06-11 19:18:29
【问题描述】:

我在 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

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    您的 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-reset,其中 example-user 是您尝试在路径中匹配的用户名。

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

    【讨论】:

    • 您好,谢谢!我意识到我的错误我修复了它。出于安全原因,我也更改了我的 url 结构,现在一切似乎都正常
    【解决方案2】:

    我看到在 HTML 中呈现的表单不会重置管理员用户密码,但是其他的可以。就我而言,我只是扩展了用户类并插入了电子邮件字段。

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多