NotImplementedError:Django 没有为 AnonymousUser 提供数据库表示
Posted
技术标签:
【中文标题】NotImplementedError:Django 没有为 AnonymousUser 提供数据库表示【英文标题】:NotImplementedError: Django doesn't provide a DB representation for AnonymousUser 【发布时间】:2019-02-15 18:59:12 【问题描述】:我收到以下错误:
Traceback:
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\exception.py"
in inner
35. response = get_response(request)
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\base.py" in
_get_response
128. response = self.process_exception_by_middleware(e,
request)
File "C:\Users\HP\GST\lib\site-packages\django\core\handlers\base.py" in
_get_response
126. response = wrapped_callback(request, *callback_args,
**callback_kwargs)
File "C:\Users\HP\Desktop\erpcloud\accounts\views.py" in change_password
31. if form.is_valid():
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in is_valid
179. return self.is_bound and not self.errors
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in errors
174. self.full_clean()
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in
full_clean
376. self._clean_fields()
File "C:\Users\HP\GST\lib\site-packages\django\forms\forms.py" in
_clean_fields
397. value = getattr(self, 'clean_%s' % name)()
File "C:\Users\HP\GST\lib\site-packages\django\contrib\auth\forms.py" in
clean_old_password
366. if not self.user.check_password(old_password):
File "C:\Users\HP\GST\lib\site-packages\django\contrib\auth\models.py" in
check_password
396. raise NotImplementedError("Django doesn't provide a DB
representation for AnonymousUser.")
Exception Type: NotImplementedError at /accounts/change-password/
Exception Value: Django doesn't provide a DB representation for
AnonymousUser.
我的观点是这样的:
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
update_session_auth_hash(request, user)
return redirect(reverse('company:Dashboard'))
else:
return redirect(reverse('accounts:change_password'))
else:
form = PasswordChangeForm(user=request.user)
args = 'form': form
return render(request, 'accounts/change_password.html', args)
首先,我认为这是因为我没有更新 Django,但现在我更新了,我收到了同样的错误。
我查看了其他用户提出的一些解决方案,但没有一个适用于我的案例
有什么帮助吗?
【问题讨论】:
这是因为你的user
没有登录。所以request.user
是一个AnonymousUser
,没有数据库表,所以你可以不保存它。
【参考方案1】:
视图本身没有任何问题。问题是如果用户没有登录,那么request.user
将指向AnonymousUser
对象。您可以将其视为虚拟用户。然而,这个用户没有数据库表示,因为我们对用户一无所知。更多用于提供统一的接口。
现在由于request.user
是AnonymousUser
,您的目标是更改该用户的密码,但您无法将其存储到数据库中,因此出现错误。
因此用户首先需要登录,然后request.user
将是一个真实用户,更新密码应该可以工作。
不过,我建议在视图中添加一个 @login_required
装饰器以防止这种情况发生:
from django.contrib.auth.decorators import login_required
@login_required
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(data=request.POST, user=request.user)
if form.is_valid():
form.save()
update_session_auth_hash(request, user)
return redirect(reverse('company:Dashboard'))
else:
return redirect(reverse('accounts:change_password'))
else:
form = PasswordChangeForm(user=request.user)
args = 'form': form
return render(request, 'accounts/change_password.html', args)
【讨论】:
以上是关于NotImplementedError:Django 没有为 AnonymousUser 提供数据库表示的主要内容,如果未能解决你的问题,请参考以下文章
kotlin.NotImplementedError: 操作未在 EditText 上使用 addTextChangedListenerher 实现
NotImplementedError:具有分组映射 Pandas UDF 的无效 returnType
NotImplementedError:Django 没有为 AnonymousUser 提供数据库表示