0

这部分代码代表我网页的索引,例如: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))  

为什么我在调试时仍然收到此错误?

/ 'AnonymousUser' 对象的 AttributeError 没有属性 'get_profile'

提前致谢

4

6 回答 6

5

您需要添加此检查:

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装饰器,您需要确保有一个LOGIN_URL设置指向处理您网站的登录表单的视图。默认情况下这是/accounts/login/

我将方法名称更改为小写,因为 CamelCase 通常用于 Python 中的类。此外,您不需要两个 return 语句,因为您正在呈现相同的模板。相反,在您的index.html模板中,您可以执行以下操作:

{% if profile %}
    You have a profile!
{% else %}
    You don't
{% endif %}

文档中的身份验证条目中列出了身份验证的提示和技巧。

于 2012-08-30T02:17:44.233 回答
0

因为用户当前未登录。当您调用 get_profile 时,它​​会在 Django 提供的名为 AnonymousUser 的默认用户上调用,该用户没有 get_profile 方法,因为它不是真正的用户。我假设它不会引发异常,因此您会收到错误。登录后尝试相同的操作,应该没问题。

于 2012-08-30T01:51:13.757 回答
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))  
于 2012-08-30T01:56:26.990 回答
0

您期待一个User.DoesNotExist错误,但代码却抛出了一个AttributeError. 这是因为request.user它是一个真实的对象——一个AnonymousUser对象——并且访问它不会导致错误,但是AnonymousUser没有配置文件。

改用@login_required装饰器,或捕获AttributeError,或调整您的代码,使其实际抛出User.DoesNotExist

于 2012-08-30T02:09:16.860 回答
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))

你不需要 except,因为Userwith 总是在那里。

于 2012-08-30T02:09:52.600 回答
-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,示例已更新。

于 2012-08-30T02:11:54.443 回答