这部分代码代表我的网页索引 例如:127.0.0.1:8000 /
def IndexView(request):
try:
profile = request.user.get_profile()
except User.DoesNotExist:
return render_to_response('index.html',
{'request': request,},
context_instance=RequestContext(request))
return render_to_response('index.html',
{'request': request, 'profile' : profile},
context_instance=RequestContext(request))
为什么我在调试时仍然出现此错误?
/的AttributeError 'AnonymousUser'对象没有属性'get_profile'
提前致谢
答案 0 :(得分:4)
您需要添加此项检查:
from django.shortcuts import render
def index_view(request):
if request.user.is_authenticated():
profile = request.user.get_profile()
return render(request,'index.html',{'profile': profile})
else:
return redirect('login/')
或者,您可以使用内置的装饰器,确保仅使用登录用户调用您的视图:
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def index_view(request):
profile = request.user.get_profile()
return render(request,'index.html',{'profile': profile})
如果您使用login_required
decorator,则需要确保您的LOGIN_URL
设置指向处理您网站登录表单的视图。默认情况下,这是/accounts/login/
我将方法名称更改为小写,因为CamelCase通常用于Python中的类。此外,由于渲染相同的模板,因此不需要两个return语句。相反,您可以在index.html
模板中执行以下操作:
{% if profile %}
You have a profile!
{% else %}
You don't
{% endif %}
有关身份验证的提示和技巧列在文档中的authentication entry。
答案 1 :(得分:0)
因为用户当前没有登录。当你调用get_profile时,它会被Django提供的默认用户调用,称为AnonymousUser,它没有get_profile方法,因为它不是真正的用户。它没有抛出我假设的异常,因此你得到一个错误。 登录后尝试相同的事情,它应该没问题。
答案 2 :(得分:0)
您收到此错误,因为此特定用户未登录。
要防止错误,请在视图上使用@login_required
装饰器:
from django.contrib.auth.decorators import login_required
@login_required
def IndexView(request):
...
或:
def IndexView(request):
if request.user.is_authenticated(): #check to use if user is logged in
try:
profile = request.user.get_profile()
except User.DoesNotExist:
return render_to_response('index.html',
{'request': request,},
context_instance=RequestContext(request))
return render_to_response('index.html',
{'request': request, 'profile' : profile},
context_instance=RequestContext(request))
答案 3 :(得分:0)
您预计会出现User.DoesNotExist
错误,但代码却会抛出AttributeError
。这是因为request.user
是一个真实的对象 - 一个AnonymousUser
对象 - 并且访问它不会导致错误,但AnonymousUser
没有配置文件。
使用@login_required
装饰器,或者抓住AttributeError
,或调整代码,使其实际投掷User.DoesNotExist
。
答案 4 :(得分:0)
在尝试通过get_profile
提取个人资料之前,您需要检查用户是否已通过身份验证。您还可以简化代码:
def IndexView(request):
profile = request.user.is_authenticated() and request.user.get_profile()
return render_to_response('index.html',
{'request': request, 'profile': profile},
context_instance=RequestContext(request))
你不需要除外,因为User
始终在那里。
答案 5 :(得分:-1)
只是为了让你知道,那不是很干的代码。
检查它:def index_view(request):
context_data = {'request': request}
try:
context_data.update('profile': request.user.get_profile())
except AttributeError:
pass
return render_to_response('index.html', context_data,
context_instance=RequestContext(request))
另外,我会仔细检查并确保请求尚未包含在上下文中。您可能没有必要在此处具体说明。
编辑:忘记将context_data传递给render_to_response,示例已更新。