我有一些代码,获取当前登录的用户。

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你想要的意见。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top