提问人:Cato Johnston 提问时间:7/7/2009 最后编辑:Cato Johnston 更新时间:7/8/2009 访问量:1185
保持 Django 视图干燥
Keeping Django Views DRY
问:
我有一些代码可以获取当前登录的用户。
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()
并将它们列在每一页上。
我是否必须编写该代码并将列表传递给每个视图中的模板。或者我可以编写一次代码,使该列表可用于所有模板吗?
答:
3赞
AlbertoPL
7/7/2009
#1
会话中已存在用户 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))
评论
0赞
Cato Johnston
7/7/2009
对不起,我打错了字,我想将整个 User 对象传递给模板,而不仅仅是 id
0赞
AlbertoPL
7/7/2009
同样,如果您已将用户添加到会话中,则整个用户已经存在,因此您应该能够访问其任何字段。
1赞
Van Gale
7/7/2009
@Cato:如果您将 django.core.context_processors.auth 放入设置中,{{ user }} 可用于任何模板。TEMPLATE_CONTEXT_PROCESSORS,但匿名用户不是 None,它们是 AnonymousUser 的实例。请参阅 docs.djangoproject.com/en/dev/topics/auth/...
1赞
Alcides
7/7/2009
#2
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你想要的视图。
1赞
Alex Jillard
7/8/2009
#3
您应该为此类内容使用自定义模板标签。您可以在自定义标签中获取所需的数据,并将其发送到模板。您需要记住的是将代码加载到要使用它的模板文件中。
评论
0赞
Andre Bossard
7/8/2009
但是,您在 20 个模板中拥有 {% load my _template_tag %} ...这不是干的
3赞
Alex Jillard
7/8/2009
如果您经常使用它,则它很可能位于您要扩展的父模板中,因此,您只会将其放在一个位置。如果不是这种情况,则可以使用自定义上下文处理器。
评论