在 Django 中尝试/除外,良好实践

cle*_*ula 0 django exception-handling try-catch

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

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

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

提前致谢

Bur*_*lid 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/')
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用内置装饰器来确保您的视图仅被登录用户调用:

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})
Run Code Online (Sandbox Code Playgroud)

如果您使用login_required装饰器,您需要确保您有一个LOGIN_URL指向处理站点登录表单的视图的设置。默认情况下这是/accounts/login/

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

{% if profile %}
    You have a profile!
{% else %}
    You don't
{% endif %}
Run Code Online (Sandbox Code Playgroud)

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