2009-07-07 87 views
1

我有一些代码,获取当前登录的用户。保持Django的意见干

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。

是否必须编写该代码并将列表传递给每个视图中的模板?或者我可以编写一段代码,让所有模板都可以使用该列表?

回答

1

你应该使用custom template tag这样的东西。您可以在自定义标签中获取所需的数据,并将其发送到模板。所有你需要记住的是加载模板文件中的标签,你要使用它。

3

用户标识已存在于会话中。因此,你不需要继续传递它。

{{ 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)) 
+0

对不起,我犯了一个错字 我想将整个用户对象传递给模板不仅仅是id – 2009-07-07 10:34:13

+0

此外,如果您已将用户添加到会话中,则整个用户已经在那里,因此您应该可以访问其任何字段。 – AlbertoPL 2009-07-07 10:44:26

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