2

当使用示例"views.py without functions.py"时,它工作正常并且会话正在被检查,所以它返回用户名。

但是,当使用第二个示例时,使用 functions.py,向我显示以下错误

/login/ 处的名称错误

未定义全局名称“请求”

没有functions.py的views.py

def main(request):
    c = {}
    c.update(csrf(request))

    if request.session.get('username'):
        susername = request.session['username']
    else:
        susername = ""

    return render_to_response("login/login.html",{'username': susername},context_instance=RequestContext(request))

views.py 和 functions.py

def main(request):
    c = {}
    c.update(csrf(request))

    susername = loggedin()


    return render_to_response("login/login.html",{'username': susername},context_instance=RequestContext(request))

函数.py

from django.template import RequestContext

def loggedin():
    if request.session.get('username'):
        susername = request.session['username']
    else:
        susername = ""

    return susername

为什么第二个不起作用,我该如何解决?

谢谢

4

2 回答 2

4

你正在写的是一个模板上下文处理器,你应该这样写:

def loggedin(request):
    return {'username': request.session.get('username','')}

将其保存在文件中,并将其添加到TEMPLATE_CONTEXT_PROCESSORSsettings.py'django.core.context_processors.request',行后。

如果您将文件命名为someapp/processors.py,那么您将添加'somapp.processors.loggedin',到元组中。

然后,只要您返回 的实例RequestContext,您的模板中就会有{{ username }}

于 2013-06-23T10:48:51.733 回答
2

想想看。请求不作为参数传递,因此在loggedin()函数范围内是未知的。

您可以简单地传递请求,例如

susername = loggedin(request)

或者,在这种情况下,只需通过您需要检查的内容。

susername = loggedin(request.session)

并将功能更改为

def loggedin(session):
    return session['username'] if session.get('username') else ''
于 2013-06-23T10:37:16.703 回答