【问题标题】:Django doesn't provide a DB representation for AnonymousUserDjango 不为 AnonymousUser 提供数据库表示
【发布时间】:2020-01-13 06:32:00
【问题描述】:

我通过电子邮件确认自定义重置密码。

path('password_reset', views.reset_password_view, name='password-reset'),
path('password_reset/done', views.reset_password_done_view, name='password_reset_done'),
path('reset/<uidb64>/<token>/', views.password_confirm_view, name='password_reset_confirm') #this url

def password_confirm_view(request, uidb64, token):
context = {}
if request.method == 'POST':
    form = SetPasswordForm(data=request.POST, user=request.user)
    if form.is_valid():
        form.save() #I have error
        update_session_auth_hash(request, form.user)
        return redirect('password_reset_done')
else:
    form = SetPasswordForm(user=request.user)
context['form'] = form
return render(request, 'mdm/registration/password_confirm.html', context)



Exception Type:NotImplementedError
Exception Value:Django doesn't provide a DB representation for AnonymousUser.

模板:

form enctype="multipart/form-data" method="post">
                    {% csrf_token %}
                    <div class="input-group register">
                        {{ form.new_password1.errors }}
                        <label for="id_new_password1">Пароль: </label>
                        {{ form.new_password1 }}
                    </div>
                    <div class="input-group register">
                        {{ form.new_password2.errors }}
                        <label for="id_new_password2">Подтвердите пароль: </label>
                        {{ form.new_password2 }}                            
                    </div>                        
                    <div class="justify-content-center">
                        <button class="btn btn-block btn-sm btn-info mt-5" type="submit">Сменить пароль</button>
                    </div>
                </form>

我发送电子邮件以更改未授权用户的密码(忘记密码)。他跟踪了电子邮件中的链接。他必须输入密码并确认并保存表格。 我如何授权用户?我想,我必须使用 (uidb64, token)。

【问题讨论】:

  • 您的问题不清楚。此代码要求用户已经登录。
  • 我发送电子邮件以更改未授权用户的密码(忘记密码)。他跟踪了电子邮件中的链接。他必须输入密码并确认并保存表格。
  • 但是你不应该使用request.user。你为什么这样做?关键是用户是通过 UID 和令牌来识别的。
  • 请注意,在任何情况下整个代码都是毫无意义的,因为这个功能是already provided by Django。不用自己写。
  • 是的。我使用来自 django 的功能,如下所示: path('reset///', auth_views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),它正在工作,但我想在没有管理面板的情况下执行此操作。有什么更好的方法?

标签: django django-forms


【解决方案1】:

这很容易。谢谢你,@丹尼尔·罗斯曼。

path('reset/<uidb64>/<token>/',
     auth_views.PasswordResetConfirmView.as_view(template_name='app/registration/password_confirm.html'),
     name='password_reset_confirm')

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 2021-12-09
    • 2015-11-30
    • 1970-01-01
    • 2012-07-12
    • 2021-10-21
    • 2013-09-11
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多