我有一些代码可以获取当前登录的用户。
userID = request.session.get("_auth_user_id")
if userID:
loggedin_user = User.objects.get(pk=int(userID))
else:
loggedin_user = None
我希望用户名显示在每个页面上。
目前我将代码放在每个视图中并将用户对象传递给每个模板
return render_to_response('index.html', {loggedin_user})
这似乎与django的D.R.Y道德相悖。我怎么能重复自己呢?
编辑:也许用户是个坏榜样。
如果我想从数据库中获取对象列表
,该怎么办?items = Item.objects.all()
并在每个页面上列出它们。
我是否必须编写该代码并将列表传递给每个视图中的模板。或者,我可以编写一些代码,使所有模板都能使用该列表吗?
答案 0 :(得分:3)
会话中已存在用户ID。因此,您无需继续传递它。
{{ request.session._auth_user_id }}
这应该可行,但您需要在设置文件中的TEMPLATE_CONTEXT_PROCESSORS中添加它:
django.core.context_processors.request
在render_to_response中,您需要将请求添加为参数。例如:
return render_to_response('test.html',{}, context_instance=RequestContext(request))
答案 1 :(得分:1)
request.user?
怎么样?if request.user.is_authenticated():
name = request.user.username
else:
name = "Anonymous"
无论如何,如果它还没有在django中可用,我建议你编写一个中间件类,就像django.contrib.sessions.middleware.SessionMiddleware或django.contrib.auth.middleware.AuthenticationMiddleware一样。该类在将请求详细信息发送到视图之前对其进行更改。
如果你需要在每个视图的基础上,你可以写一个装饰器来做那么一点,@decorator你想要的视图。
答案 2 :(得分:1)
你应该使用custom template tag这样的东西。您可以在自定义标记中获取所需的数据,并将其发送到模板。您需要记住的是将标签加载到您将要使用它的模板文件中。