保持 Django 视图干燥

Keeping Django Views DRY

提问人:Cato Johnston 提问时间:7/7/2009 最后编辑:Cato Johnston 更新时间:7/8/2009 访问量:1185

问:

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

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()

并将它们列在每一页上。

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

django dry django-views

评论


答:

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
如果您经常使用它,则它很可能位于您要扩展的父模板中,因此,您只会将其放在一个位置。如果不是这种情况,则可以使用自定义上下文处理器。