题
我有一些代码,获取当前登录的用户。
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()
和列出它们上everypage。
我必须写代码和列表传递给每一个视图模板。或者,我可以写一些代码一次,这将使该列表提供给所有的模板?
解决方案
您应该使用自定义模板标记为类似的东西。您可以获取您的自定义标签所需要的数据,并将其发送到模板。所有你需要记住的是加载在你打算在使用它的模板文件中的标签了。
其他提示
的用户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))
什么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你想要的意见。
不隶属于 StackOverflow