使用示例" views.py而不使用functions.py" 时,它正在运行正常并正在检查会话,所以它返回用户名。
但是,当使用第二个示例 with functions.py 时,会显示以下错误
/ login /
中的NameError全球名称'请求'未定义
views.py没有functions.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 with 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))
functions.py
from django.template import RequestContext
def loggedin():
if request.session.get('username'):
susername = request.session['username']
else:
susername = ""
return susername
为什么第二个不起作用,我该如何解决?
由于
答案 0 :(得分:4)
您所编写的是模板上下文处理器,您应该这样写:
def loggedin(request):
return {'username': request.session.get('username','')}
将其保存在文件中,并在TEMPLATE_CONTEXT_PROCESSORS
行之后的settings.py
中将其添加到'django.core.context_processors.request',
。
如果您将文件命名为someapp/processors.py
,则会将'somapp.processors.loggedin',
添加到元组。
然后,只要您返回RequestContext
的实例,您的模板中就会有{{ username }}
。
答案 1 :(得分:2)
想一想。请求不作为参数传递,因此在loggedin()
函数的范围内未知。
您可以像
一样传递请求susername = loggedin(request)
或者,在这种情况下,只需传递您需要检查的内容。
susername = loggedin(request.session)
将功能更改为
def loggedin(session):
return session['username'] if session.get('username') else ''